PIDが指定されたIE8ウィンドウのIWebBrowser2ポインターを見つける方法
-
22-07-2019 - |
質問
これまで、次の関数を使用して、実行中のInternet ExplorerインスタンスへのIWebBrowser2ポインターを取得しました(PIDが指定されている場合)。
static SHDocVw::IWebBrowser2Ptr findBrowserByPID( DWORD pid )
{
SHDocVw::IShellWindowsPtr ptr;
ptr.CreateInstance(__uuidof(SHDocVw::ShellWindows));
if ( ptr == NULL ) {
return 0;
}
// number of shell windows
const long nCount = ptr->GetCount();
// iterate over all shell windows
for (long i = 0; i < nCount; ++i) {
// get interface to item no i
_variant_t va(i, VT_I4);
IDispatchPtr spDisp = ptr->Item(va);
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
if (spBrowser != NULL) {
// if there's a document we know this is an IE object
// rather than a Windows Explorer instance
HWND browserWindow;
try {
browserWindow = (HWND)spBrowser->GetHWND();
} catch ( const _com_error &e ) {
// in case ->GetHWND() fails
continue;
}
DWORD browserPID;
GetWindowThreadProcessId( browserWindow, &browserPID );
if ( browserPID == pid ) {
return spBrowser;
}
}
}
return 0;
}
CreateProcess
を介して explorer.exe
プロセスを起動し、上記の関数を使用してIWebBrowser2Ptrを取得します(これにより、ブラウザ)。
残念ながら、IE8はプロセスを再利用するように思われるため、少なくともある程度はInternet Explorer 8では動作しないようです。次のような2つのコードシーケンスの場合:
PROCESS_INFORMATION pi;
// ...
if ( CreateProcess( ..., &pi ) ) {
// Wait a bit to give the browser a change to show its window
// ...
IWebBrowser2 *pWebBrowser = findBrowserByPID( pi.dwProcessId );
}
このコードの最初の実行は正常に機能し、2番目の実行ではpWebBrowserウィンドウを取得することはできません。
少しデバッグした後、 findBrowserByPID
関数は多くのブラウザーウィンドウを検出します(2番目のブラウザーインスタンスを起動するとさらに多くを検出します)が、それらのいずれも新しくプロセスを開始しました。すべてのウィンドウは、開始された最初のIEプロセスに属しているようです。
IE8インスタンスへのIWebBrowser2ポインターを取得する別の方法を知っている人はいますか?または、IE8でプロセスのこの見かけの「再利用」を無効にする方法はありますか?
解決
IEプロセスを自分で起動する場合は、CreateProcessを使用しないでください。代わりに、CoCreateInstanceを使用してください。これにより、IWebBrowser2を照会できるオブジェクトが返され、自由に使用できます。 1つの複雑さは、ナビゲーションが整合性レベル(Vista +)を超えると、ポインターが無効になることです。この問題に対処するには、NewProcessイベントを同期します。これにより、この状態を検出できます。
ここで詳細を参照してください: http:/ /msdn.microsoft.com/en-us/library/aa752084%28VS.85%29.aspx
他のヒント
いくつかの代替アプローチは次のとおりです:
-
WatiN のようなライブラリを使用します。 IEを自動化しようとしています。