使用 PowerShell 观察 Win32 窗口句柄

PowerShellカテゴリを表すパンダのイラスト PowerShell

关于本文
本文是通过利用生成式 AI 的自动生成流程创建的。在确认了 Microsoft Learn 的 Process.MainWindowHandle 和 Win32 窗口官方文档的同时,以只读方式观察 GUI 进程的 HWND,并梳理了使用 GUI 自动化时的注意事项。

验证状态:📘 已确认官方规范・Windows 实机未验证

在 Windows 的 GUI 中,用于识别窗口的值是 HWND(窗口句柄)。通过 PowerShell 查看这一点,我们可以发现平时作为画面看到的 Windows UI,在 Win32 中被当作具有标识符的对象来处理。

首先进行尝试

请在打开记事本等一个 GUI 应用程序后运行。

Get-Process |
    Where-Object MainWindowHandle -ne 0 |
    Select-Object -First 10 -Property         ProcessName,
        Id,
        MainWindowTitle,
        @{n='HWND';e={'0x{0:X}' -f $_.MainWindowHandle}}

0x... 如果显示了该值,则说明已获取了进程所拥有的主窗口句柄。

PID 与 HWND 是不同的概念

flowchart LR
P[Process / PID] --> W[Main Window]
W --> H[HWND]

PID 是识别进程的值,而 HWND 是识别窗口的值。

由于一个进程可能拥有多个窗口,因此并不一定是“一个进程 = 一个窗口”。

它用于什么

许多 Win32 API 都使用 HWND 来指定目标窗口。

例如:

  • 获取标题

  • 获取位置和大小

  • 置于前台

  • 枚举

  • 确认父子关系

等等。

在 PowerShell 中观察 MainWindowHandle 是使用 Win32 API 的入门。

如何在工作中应用

  • 确认 GUI 自动化目标的候选对象

  • 诊断是否打开了多个窗口

  • 确认应用程序的主界面是否已生成

  • 在调用 Win32 API 之前确定目标

  • 辅助测试自动化或运维工具

但是,直接操作“最先找到的 HWND”的设计是有风险的。

为什么有风险

可能会遇到同一应用启动了多次、标题相似、或者进程没有主窗口等情况。

此外,在应用刚启动时,MainWindowHandle 可能尚未确定。

因此,在实际工作中,流程如下:

  1. 通过 ProcessName 缩小候选范围

  2. 确认 PID

  3. 确认 MainWindowTitle

  4. 确认候选数量

  5. 必要时在 Refresh() 之后重新获取

当仅靠 MainWindowHandle 不够时

MainWindowHandle 是用于查看“进程主窗口”的入口。当需要处理子窗口或多个顶级窗口时,EnumWindows 等通过 Win32 API 进行枚举可能是必要的。

也就是说,本文的方法并非 GUI 自动化的最终形态,而是观察 Win32 窗口识别的冒烟测试

总结

  • PID 和 HWND 是不同的标识符

  • 可以通过 MainWindowHandle 观察 GUI 的底层

  • 并不一定是一个进程对应一个窗口

  • 在 GUI 自动化中,不要仅凭名称确定目标

  • 考虑多个候选对象以及刚启动时的状态

官方信息与第一手资料

文档信息

文章??
使用 PowerShell 观察 Win32 窗口句柄
?布日期
更新日期
来源
https://papanda925.com/?p=17065&lang=zh

?可: ?于本站?有相??利的正文及原??表,除非?有?明,可依据 CC BY 4.0 使用。本文可能包含使用生成式AI?建或??的内容。若代??有?可声明,或?接的GitHub???定了?可,?代?以??可?准。引用内容、第三方?料、?片及商?不在本?可范?内。 使用政策

标题和URL已复制