如何将最小化的程序窗口恢复到托盘中

Ped*_*o77 2 c# restore system-tray

可能的重复:
恢复另一个应用程序的最小化窗口

我想恢复(显示并给予焦点)外部程序。

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

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

我已经搜索过 google 和 stackoverflow。我发现了一些有相同问题的帖子,但没有答案。

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

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


我可以使用FindWindow,

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

但如果有多个具有相同类和标题的进程,FindWindow 将仅返回其中一个进程,我该如何解决这个问题?

Vla*_*lov 5

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

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