4

ShDocVwオブジェクトにアクセスするために相互運用アセンブリを使用していInternetExplorerます。

foreach(InternetExplorer IE in new ShellWindowsClass())
{
   Console.Log(IE.HWND.ToString() + Environment.NewLine);
}

結果は - 同じウィンドウ レポートのすべてのタブはHWNDMainWindowHandleそのウィンドウのプロセスと同じです。実際、これらのオブジェクトには、それらを互いに区別する明確な情報は見つかりません

そして、これらのインスタンスを実際のタブに関連付けて、それらをウィンドウ イベント (ウィンドウ フォーカスの変更がほとんど) に一致させる必要があります。Frame Tabこのオブジェクトと、対応するインスタンスまたはTabWindowClassウィンドウ インスタンスとの間のリンクを見つけることができれば幸いです。

これを達成する方法はありますか?

4

1 に答える 1

4

さて、これは完璧ではありませんが、私が思いついたのは次のとおりです。

  1. HWNDオブジェクトから取得しInternetExplorerます。これはwindowのハンドルです。
  2. EnumChildWindowsまたはを使用FindWindowExしてその子ウィンドウをトラバースし、 class を持つ子ウィンドウを見つけますFrame TabタブIntPtr tabHandleのハンドルを取得します。コールバックを使用せず、ループで反復するため、個人的にはここの方が好きです...FindWindowEx
  3. 次に、 #2 で発見されFindWindowExた を再度使用してtabHandle、 class を持つ子に到達しTabWindowClassます。取得しますIntPtr tabTitleHandle-これは、タブウィンドウのタイトルを保持するウィンドウです(場所名+「-Internet Explorer smth」が含まれます。MSIEディストリビューションをカスタマイズできるため、このテキストは異なる可能性があるため、「smth」と書きます)。
  4. GetWindowTextonを使用しtabTitleHandleて、ウィンドウ タイトルを取得します。
  5. InternetExplorerここで、コレクション内のオブジェクトを反復処理しShellWindowsClass、まず PID を確認します。同じプロセスで作成されたインスタンスを比較するだけでよく、次に #4 で取得したウィンドウ タイトルを確認します.StartsWith(IE.LocationName + " - ")。「 - 」に注意してください。ブラウザ自体を識別するテキストがあると想定できますが、カスタマイズできるため、実際には推測できません。ウィンドウのタイトルが場所の名前で始まる場合、それらは相関していると見なされます。

私が言ったように、これは完璧ではありません (最終的な試合はタイトルによって行われるため) が、これまでに得た最高のものです. それが役立つことを願っています。そして、私はまだ完璧な解決策を待っています。掘り続けてください! ;)

于 2012-08-15T13:19:01.820 に答える