2012-03-21 113 views
0

可能重复:
Restore a minimized window of another application如何恢复一个程序的窗口最小化到托盘

我要恢复(演出,并给予重点)到外部程序。

问题是,如果它在托盘上的MainWindowHandle是0,所以我无法恢复窗口。

Process[] process = Process.GetProcessesByName("MyApp"); 
//process.MainWindowHandle == 0 if it is on tray!! :(

我已经搜索谷歌和stackoverflow。我发现了一些具有相同问题的线程,但没有答案。

[DllImport("user32.dll")] 
public static extern bool ShowWindow(IntPtr windowHandle, ShowWindowFlag flag); 

如何从托盘弹出外部应用程序并将其带到任务栏?


我可以用FindWindow函数,

[DllImport("User32.dll", CharSet = CharSet.Unicode)] 
    public static extern IntPtr FindWindow(string className, string windowName); 

,但如果有更多的一个过程相同类别和标题,FindWindow函数将返回只是其中之一,我怎么能解决这个问题?

+0

不,它不是重复的,我的问题是当应用程序被隐藏时,最小化到托盘。 – Pedro77 2012-03-21 15:34:50

回答

4

问题是,Windows没有支持将窗口最小化为系统托盘。没有这样的状态。而为了模拟这种行为,应用程序完全隐藏窗户。 您可以使用Spy ++工具在目标应用程序可见时查找它的窗口。 然后“最小化”它到托盘,并查看属性中发生了什么变化。然后在你的应用程序中,你应该恢复属性。这是必要的,因为有几种方法可以隐藏窗口,不同的应用程序使用其中的一种。

例如,Windows任务管理器将样式从VS_VISIBLE更改为VS_MINIMIZED(并删除VS_VISIBLE)。

+0

谢谢,但如果应用程序已经在托盘上呢?没办法解决这个问题? – Pedro77 2012-03-21 15:50:51

+0

您应该只执行一次所描述的步骤,以便找到如何恢复窗口的确切方式以及它的类别和名称。然后,您可以调用FindWindow WinAPI函数(或C#中的等效函数,我不确定它是如何调用的),它会返回一个句柄给您,您可以改变窗口的样式,使其再次可见。 – 2012-03-21 16:05:16

+0

如果有多个应用程序以相同的类和名称运行,该怎么办? – Pedro77 2012-03-21 16:47:04

相关问题