【问题标题】:How to get the window handle of another app minimized to the system tray?如何将另一个应用程序的窗口句柄最小化到系统托盘?
【发布时间】:2023-03-17 13:57:02
【问题描述】:

实例 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]

【问题讨论】:

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


    【解决方案1】:

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

    "我有一个线程 ID。我如何获得 对应的窗口?”

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

    “是的,我知道 EnumThreadWindows, 但是我如何获得我的窗口 想要吗?”

    嗯,你还没说你想要什么 还没有。

    "我想要对应的窗口 线程。”

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

    “这就是我要问你的!”

    但是你还没有描述你的内容 想要。

    "我想要对应的窗口 线程。为什么不回答我的 问题?”

    请注意,“我正在寻找 顶层无主窗口”是一个 前进,但仍然没有 唯一标识一个窗口。有可以 是多个顶级无主窗口 在一个过程中。例如,资源管理器 通常有很多顶级 无主的窗户。有桌面, 任务栏,您打开的文件夹窗口, 和属性表。如果你要求 "the" 的顶级无主窗口 探险者,你想要哪一个?

    也许人们已经明白了 有一种独特的方法 为进程指定“the”窗口 因为 System.Diagnostics.Process 对象有一个属性叫做 主窗口句柄。文档 因为那个属性没​​有做任何事情 打消这个念头,要么。我有 不知道该属性如何决定 在多个顶级无主之间 窗户。

    这个话题也在MSDN Q&A Get the Main Window中详细阐述:

    如何找到进程的主窗口?我正在编写一个类似 Spy 的工具,我需要获取进程的主窗口 (HWND),以便向它发送 WM_ACTIVATEAPP 之类的消息。

    A您指的是哪个主窗口?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多