5

次のようにProcess.MainWindowTitleにアクセスする場合...

Process[] processes = Process.GetProcessesByName( "iexplore" );

...そして、結果の配列をループすると、MainWindowTitle配列内の1つを除くすべての項目が常に空になります。私の場合、2つのInternet Explorerウィンドウを開いています。1つは1つのタブで、もう1つは2つのタブがあります。

コードを実行すると、最後にアクティブにしたウィンドウとタブのMainWindowTitleが常に取得され、他のすべては空のままになります。奇妙なことに、MainWindowTitleが入力されるプロセスIDは常に同じです。コードを実行する前に、他のIEウィンドウまたはタブをアクティブにすると、プロセスIDは常に同じになります。

  if ( !processes.Any() )
  {
    MessageBox.Show( "TODO - No matching process found" );
    return;
  }

  if ( processes.Count() > 1 )
  {
    foreach ( Process currentProcess in processes )
    {
      // More than one matching process found
      checkedListBox1.Items.Add( currentProcess.Id + " - " + currentProcess.MainWindowTitle + " - " + currentProcess.ProcessName );
    }

    return;
  }

したがって、出力は次のように最初の実行である可能性があります。

  • 4824 --- iexplore
  • 3208 --- iexplore
  • 4864-Google-Windows InternetExplorer-iexplore

次の実行(事前に選択された他のIEウィンドウを使用):

  • 4824 --- iexplore
  • 3208 --- iexplore
  • 4864-id Software-Windows Internet Explorer-iexplore

この投稿について読んだことがありますが、問題についてはこれ以上理解できませんでした(とにかく、多少異なる方向に進んでいるようです)。

空でないMainWindowTitleを常に1つだけ取得するのはなぜですか?

4

3 に答える 3

3

InternetExplorerはホスティングモデルを使用することを忘れないでください。1つのiexplore.exeインスタンスはInternetExplorerフレームをホストし、他のiexplore.exeインスタンスはタブの内容を表示するだけです。

トップレベルウィンドウを持つ唯一のIEインスタンスは、フレームをホストするiexplore.exeプロセスです。

この記事では、さまざまなWebブラウザのマルチプロセスアーキテクチャについて説明します。私が理解しているように、ブラウザはマルチプロセスモデルに移行しています。そうすれば、あるWebページで障害が発生しても他のページに影響を与えることはありません。 この記事では、IEのマルチプロセスモデルについて詳しく説明します。

于 2012-04-08T15:24:22.870 に答える
1

これを確実に実現するための1つのオプション(上記のコメントを参照)は、BHO -espを実装することです。このシナリオでは、DWebBrowserEvents2::WindowStateChangedイベントが役立ちます。

BHOは、一連のCOMインターフェイスの実装であり、ブラウザプロセス/各タブに読み込まれます...それらを実装する最良の方法は、C++IMOを使用することです。

ただし、.NETでこれを行うことは確かに可能です(推奨されていませんが)。

于 2012-04-08T16:46:01.110 に答える
0

私も同じ問題を抱えていました。Teamviewer Hostを使用すると、一部のアプリケーションにQuickConnectボタンがあります。私の場合、WinWordです。QuickConnectを削除または無効にすると、MainWindowTitleが拡張されます

于 2015-01-07T14:04:50.803 に答える