2


0

システムトレイに最小化された別のアプリのウィンドウハンドルを取得する方法

インスタンス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]

1 Answer


3


それは、あなたが望むものが基本的に存在せず、 `MainWindowHandle`の概念が永遠の混乱のために.Net Frameworkに忍び込んだひどい誤称だからです。 複数(またはゼロ)になることがあります:プロセスをウィンドウに変換する

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

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

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

さて、あなたはまだ何を望んでいるかを言っていません。

「スレッドに対応するウィンドウが必要です。」

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

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

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

「スレッドに対応するウィンドウが必要です。 どうして私の質問に答えないの?」

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

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

このトピックは、MSDN Q&A http://msdn.microsoft.com/en-us/magazine/cc301495.aspx [メインウィンドウの取得]でも詳しく説明されています。

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

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