Закрыть всплывающие окна Mozilla Firefox в C#
Некоторые средства браузера пытаются заблокировать всплывающие окна рекламы, но в последнее время некоторые из них пробираются через мою систему, поэтому я написал эту программу, чтобы закрыть всплывающие окна Firefox, когда они появятся. Запустите Firefox и создайте нужные вам окна. Затем запустите программу. Позже, когда веб-страница пытается отобразить всплывающее окно, программа закрывает его.
Пример
Когда программа запускается, для создания списка окон рабочего стола используется следующий код.
// Создаем список текущих окон Firefox. private ListHandles = new List (); private List Titles = new List (); private void Form1_Load(object sender, EventArgs e) { // Получить окна рабочего стола. List handles = new List (); List titles = new List (); DesktopWindowsStuff.GetDesktopWindowHandlesAndTitles( out handles, out titles); // Сохранение окон Firefox. for (int i = 0; i < handles.Count; i++) { if (titles[i].EndsWith("Mozilla Firefox")) { Handles.Add(handles[i]); Titles.Add(titles[i]); } } // Отображение результатов. lstAllowedWindows.DataSource = Titles; }
Сначала код создает списки для хранения ручек и заголовков текущих окон Firefox. Затем обработчик события Load формы вызывает метод GetDesktopWindowHandlesAndTitles, описанный в предыдущий пост . Код проходит через возвращаемые окна и сохраняет записи с заголовками, заканчивающимися в «Mozilla Firefox».
Timer программы использует следующий код для проверки новых окон каждую секунду.
// Ищите новые окна Firefox. private void tmrCheckForPopups_Tick(object sender, EventArgs e) { // Получить окна рабочего стола. Listhandles = new List (); List titles = new List (); DesktopWindowsStuff.GetDesktopWindowHandlesAndTitles( out handles, out titles); // Ищите новые окна Firefox. for (int i = 0; i < handles.Count; i++) { if (titles[i].EndsWith("Mozilla Firefox")) { // Посмотрим, если это новое окно. if (!Handles.Contains(handles[i])) { // Это новое. Прекрати это. DesktopWindowsStuff.StopWindow(handles[i]); lstStoppedWindows.Items.Add(titles[i]); // Добавьте его в список разрешенных дескрипторов // поэтому мы не пытаемся остановить его снова, если это // требуется некоторое время для закрытия. Handles.Add(handles[i]); } } } }
Этот код вызывает GetDesktopWindowHandlesAndTitles снова, чтобы получить новый список текущих окон. Затем он перебирает окна в поисках тех, у кого есть названия, которые заканчиваются в «Mozilla Firefox». Когда он находит такое окно, программа проверяет, содержит ли список Handles этот дескриптор окна. Если дескриптор отсутствует в списке, программа использует метод StopWindow (описанный далее), чтобы остановить окно. Он отображает заголовок окна в остановленных окнах ListBox и добавляет дескриптор окна в список Handles, чтобы он не пытался снова остановить окно. Это предотвращает попытку программы несколько раз останавливать окно, если требуется немного времени для закрытия.
Следующий код показывает, как метод StopWindow закрывает всплывающие окна Firefox.
[return: MarshalAs(UnmanagedType.Bool)] [DllImport("user32.dll", SetLastError = true)] static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); ... // Отправить сообщение процессу. private static void PostMessageToWindow(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) { if (!PostMessage(hWnd, msg, wParam, lParam)) { // Произошла ошибка. throw new Win32Exception(Marshal.GetLastWin32Error()); } } // Остановить окно. public static void StopWindow(IntPtr hWnd) { PostMessageToWindow(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); }
Этот фрагмент кода начинается с объявления функции PostMessage API. Эта функция отправляет сообщение в окно с указанным дескриптором.
Метод PostMessageToWindow просто вызывает функцию API PostMessage.
Наконец, метод StopWindow вызывает PostMessageToWindow, чтобы отправить окно в сообщение WM_CLOSE в окно, чтобы сообщить ему о закрытии.