Слушайте близкое событие iexplorer в моем приложении

Я пишу приложение win32 на С++, и я хочу, чтобы оно что-то делало, когда все iexplorer.exe были закрыты.

Я знаю, что SetWindowsHook() может быть полезен в моем случае.

Но если я понятия не имею об идентификаторе процесса или потока IE, потому что каждый раз при открытии IE будет получать другой идентификатор потока.

Если я не использую таймер для проверки списка процессов, чтобы получить идентификатор iexplorer, есть ли другой подход для прослушивания события закрытия IE в моем приложении win32?


person Lion Kuo    schedule 24.03.2017    source источник


Ответы (1)


Объект для IE называется InternetExplorer. . ОбъектShellWindows представляет собой набор объектов InternetExplorer. Но тут все усложняется. Не все объекты InternetExplorer являются тем, что вы бы назвали окном IE. Некоторые из них являются окнами «Проводника Windows». См. О браузере (Internet Explorer).

Ниже приведена управляемая консольная программа C++, которая выводит список существующих окон и задает количество существующих окон. Затем он использует события WindowRegistered и WindowRevoked для отслеживания создания и закрытия окон. Эти события не очень хорошо задокументированы. В приведенном ниже примере элемент Document каждого объекта InternetExplorer используется для определения наличия в окне HTML. Однако см. комментарий в c# - Отличие окон IE от других окон, когда с помощью SHDocVw; в окне IE может не быть HTML.

Обратите внимание, что в следующем примере используется AutoResetEvent для продолжения работы программы, поскольку это консольная программа.

Ниже приведен заголовок:

#pragma once

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <ShlObj.h>
#include <comdef.h>
#include <vcclr.h>

Ниже приводится программа:

#include "stdafx.h"
using namespace System;
using namespace System::Threading;

static int Browsers = 0;
static gcroot<AutoResetEvent^> Event;

bool IsBrowser(SHDocVw::InternetExplorer ^ ie)
{
    MSHTML::IHTMLDocument2^ Document;
    try { Document = (MSHTML::IHTMLDocument2^)ie->Document; }
    catch (Exception^ ex)
    {
        return false;
    }
    return Document != nullptr;
}

 static void WindowRegistered(int lCookie) {
    ++Browsers;
    Console::WriteLine("WindowRegistered");
}

static void WindowRevoked(int lCookie) {
    --Browsers;
    Console::WriteLine("WindowRevoked");
    if (Browsers <= 0)
        Event->Set();
}

int main(array<System::String ^> ^args)
{
    SHDocVw::ShellWindows^ swList = gcnew SHDocVw::ShellWindowsClass();
    Console::WriteLine(L"{0} instances", swList->Count);
    for each (SHDocVw::InternetExplorer ^ ie in swList) {
        Console::WriteLine(ie->LocationURL);
        if (IsBrowser(ie)) {
            Console::WriteLine("HTML document");
            ++Browsers;
        }
        else
            Console::WriteLine("Not HTML");
        }
    if (Browsers == 0)
    {
        Console::WriteLine("No browsers");
        return 0;
    }
    Event = gcnew AutoResetEvent(false);
    swList->WindowRegistered += gcnew SHDocVw::DShellWindowsEvents_WindowRegisteredEventHandler(WindowRegistered);
    swList->WindowRevoked += gcnew SHDocVw::DShellWindowsEvents_WindowRevokedEventHandler(WindowRevoked);
    Event->WaitOne();
    Console::WriteLine("No more browsers");
    return 0;
}

Теперь я только что понял, что есть проблема с тем, как это работает. Обработчики WindowRegistered и WindowRevoked увеличивают счетчик браузеров, даже если окно не является окном IE. Я не знаю, как определить, какое окно представляет файл cookie, переданный WindowRegistered и WindowRevoked. Несколько лет назад я потратил пару дней или больше, пытаясь понять это. Итак, что вам нужно сделать, так это каким-то образом повторно перечислить все окна после каждого события WindowRegistered и WindowRevoked.

Вам необходимо добавить в проект ссылки на "Microsoft Internet Controls" (SHDocVw.dll) и "Microsoft HTML Object Library" (mshtml.dll). Это COM-объекты, которые должны находиться в вашем каталоге «C:\Windows\System32».

person user34660    schedule 24.03.2017