Объект для 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