1

私は現在 AutoIt でプログラムを書いていますが、より安全な C++ にいくつかの機能を外注したいと考えています。IEを作成してサイトに移動することができました。

しかし、それは私が必要とするものではありません。AutoIt で IE のインスタンスを作成しています。C++ で記述された部分は、この IE に接続して特定のページに移動する必要があります。

今は C++ アプリケーションですが、後ですべてが正常に実行されたら、それから .Dll を作成し、AutoIt で呼び出します。したがって、hWnd などの値を渡すことができます。

私は正当な理由でこれを行いたいので、なぜ私がこれを行っているのかを聞かないでください.

誰も私がそれを管理する方法を知っていますか? 前もって感謝します。

    CoInitialize(NULL);
IWebBrowser2* pBrowser = NULL;
HRESULT hr = CoCreateInstance(CLSID_InternetExplorer, NULL, 
    CLSCTX_SERVER, IID_IWebBrowser2, (LPVOID*)&pBrowser);

if (SUCCEEDED(hr) && (pBrowser != NULL))
{
    VARIANT vEmpty;
    VariantInit(&vEmpty);

    VARIANT vFlags;
    V_VT(&vFlags) = VT_I4;
    V_I4(&vFlags) = navOpenInNewWindow;

    BSTR bstrURL = SysAllocString(L"http://www.ard.de");

    pBrowser->Navigate(bstrURL, &vFlags, &vEmpty, &vEmpty, &vEmpty);
    pBrowser->Quit();

    SysFreeString(bstrURL);
}
if (pBrowser)
    pBrowser->Release();
CoUninitialize();
return 0;
4

2 に答える 2

1

投稿したコードは、新しい IE (タブ) インスタンスを作成しますが、これは必要なものではありません。既存のインスタンスに接続する必要があり、そのためには別のアプローチを使用する必要があります。

まず、IShellWindowsインスタンスを作成します。このオブジェクトは、シェル ウィンドウ (Windows Explorer や IE など) のレジストリへのインターフェイスです。

これで 2 つのことができます。イベントをサブスクライブして、ユーザーがウィンドウを開閉したときに通知を受け取ることができます。現在のウィンドウを列挙することもできます。

get_Count()のおよびItem()メソッドを使用して、現在のウィンドウを列挙しますIShellWindows。この列挙により、インターフェースを作成IDispatchできるインターフェースが提供QueryInterface()されIWebBrowser2ます (IE ではなく、失敗した場合はスキップしてください)。IE 以外のウィンドウが引き続き表示される可能性があるため、さらにフィルタリングが必要になる場合があることに注意してください。

ここから、探しているウィンドウかどうかを調べることができます。

于 2013-01-22T19:32:07.490 に答える
0

現在のウィンドウはすべてのシェルウィンドウでzオーダーの最上位にあるため、シェルウィンドウを列挙して最上位のウィンドウを選択できます。shellwindowsにはWindowsエクスプローラーウィンドウもリストされているため、クラス名または実行可能ファイル名のいずれかでこれらのウィンドウをフィルターで除外する必要があることに注意してください。

参照:

アクティブなWindowsエクスプローラーまたはInternetExplorerウィンドウを自動化する

于 2013-01-22T21:53:05.703 に答える