2

インスタンスAがインスタンスBのウィンドウを復元しようとしていますが、Bのウィンドウハンドルを取得できません。問題は、ウィンドウがBによってシステムトレイに最小化されていることだと思います。

this.Visibility = Visibility.Hidden;

そして、Aは以下を使用してBのウィンドウハンドルを取得しようとしています。

Process process = Process.GetCurrentProcess();
Process.GetProcessesByName(process.ProcessName).First().MainWindowHandle;

これはに等しいIntPtr.Zero

また、Spy ++を使用してクラス名でウィンドウハンドルを取得しようとしましたが、クラス名には次の形式のインスタンスごとのGUIDがあります。

HwndWrapper[FileName.exe;;ad445199-cf93-48a4-bd24-2f97d54c8af8]
4

1 に答える 1

3

これは、基本的に必要なものが存在しないためでありMainWindowHandle、.Net Framework に忍び込んで永遠の混乱をもたらすという概念は、重大な誤称であるためです。複数(またはゼロ) の場合があります: プロセスをウィンドウに変換する:

「スレッド ID を持っています。対応するウィンドウを取得するにはどうすればよいですか?」

EnumThreadWindows 関数を使用して、スレッド上のすべてのウィンドウを取得できます。

「はい、EnumThreadWindows については知っていますが、必要なウィンドウを取得するにはどうすればよいですか?」

まあ、あなたはまだあなたが望んでいたことを言っていません。

「スレッドに対応したウィンドウが欲しい」

しかし、どれですか?すべてのウィンドウの中からどのように決定しますか?

「それが私があなたに求めていることです!」

しかし、あなたはまだあなたが望むものを説明していません。

「スレッドに対応するウィンドウが欲しいのですが、なぜ私の質問に答えないのですか?」

「トップレベルの所有されていないウィンドウを探しています」と言うのは一歩前進ですが、それでもウィンドウを一意に識別するわけではありません。プロセスには、所有されていない最上位のウィンドウが複数存在する場合があります。たとえば、通常、エクスプローラーには、所有されていない最上位のウィンドウが多数あります。デスクトップ、タスクバー、開いているフォルダー ウィンドウ、プロパティ シートがあります。エクスプローラーの最上位の所有されていないウィンドウを求める場合、どのウィンドウが必要ですか?

System.Diagnostics.Process オブジェクトには MainWindowHandle と呼ばれるプロパティがあるため、プロセスの "the" ウィンドウを一意に指定する方法があると考える人もいるでしょう。そのプロパティのドキュメントも、この概念を払拭するものではありません。そのプロパティが複数の最上位の所有されていないウィンドウ間でどのように決定されるかはわかりません。

このトピックについては、MSDN Q&Aメイン ウィンドウの入手 にも詳しく説明されています。

Qプロセスのメイン ウィンドウを見つけるにはどうすればよいですか? 私はスパイのようなツールを書いていますが、WM_ACTIVATEAPP のようなメッセージを送信できるように、プロセスのメイン ウィンドウ (HWND) を取得する必要があります。

Aどのメイン ウィンドウを意味しますか?

于 2010-09-15T20:23:48.643 に答える