如何将另一个应用程序的窗口句柄最小化到系统托盘?

时间:2010-09-15 19:40:37

标签: c# .net wpf windows system-tray

实例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 个答案:

答案 0 :(得分:3)

那是因为你想要的东西基本上不存在,而MainWindowHandle的概念是一个错误的用词,它潜入了.Net框架,造成了永久的混乱。来自There can be more than one (or zero): Converting a process to a window

  

“我有一个线程ID。我怎么得到   相应的窗口?“

     

您可以使用EnumThreadWindows   函数来获取所有窗口   线程。

     

“是的,我知道EnumThreadWindows,   但是我如何获得我的窗口   要什么?“

     嗯,你还没有说出你想要的东西   爱好。

     

“我想要对应的窗口   线程。“

     

但是哪一个?你将如何决定?   在所有的窗户中?

     

“这就是我问你的问题!”

     

但你还没有描述过你   想。

     

“我希望窗口对应   线程。你为什么不回答我的问题   问题吗?“

     

请注意,“我正在寻找   顶级无主窗口“是一个   向前迈进,但它仍然没有   唯一标识一个窗口。有可以   是多个顶级无主窗口   在一个过程中。例如,资源管理器   通常有很多顶级   无主的窗户。有台式机,   任务栏,打开文件夹窗口,   和财产表。如果你要求   “最高级别的无主之窗”   资源管理器,您想要哪一个?

     

也许人们正在接受这个想法   有一种独特的方式   指定进程的“the”窗口   因为System.Diagnostics.Process   object有一个叫做的属性   MainWindowHandle。文档   该财产没有做任何事情   打消这个概念。我有   不知道该财产如何决定   在多个顶级无主之间   窗户。

主题也在MSDN Q& A Get the Main Window中详细说明:

  

如何查找流程的主窗口?我正在编写一个类似间谍的工具,我需要获取进程的主窗口(HWND),这样我就可以发送一条消息,如WM_ACTIVATEAPP。

     

A 您的意思是哪个主窗口?