如何识别窗口是不是属于特定进程?
Posted
技术标签:
【中文标题】如何识别窗口是不是属于特定进程?【英文标题】:How to identify the window is belong to a specific process?如何识别窗口是否属于特定进程? 【发布时间】:2021-04-03 01:32:15 【问题描述】:Win32 程序有一个入口参数 HINSTANCE
用于 Win32 入口函数 WinMain()
。创建自己的窗口时,CreateWindow()
API 调用需要这个参数。
我的第一个想法是,这个HINSTANCE
应该是一个唯一的标识,以区分不同的窗口属于不同的进程。直到最近,在某些情况下,我使用这个HINSTANCE
。哇!如果你打开同一个 Win32 程序 (EXE) 两次,每个进程都有相同的 HINSTANCE
值。
后来发现,是进程中的一些资源标识符(内存地址)。它是进程的虚拟地址,与它在内存中的PE结构有关。
现在,如果我有两个窗口的HWND
句柄,并且我想检查这两个窗口是否来自同一个进程,那么最好的选择是什么?
【问题讨论】:
What is the HINSTANCE passed to CreateWindow and RegisterClass used for? 【参考方案1】:您可以使用GetWindowThreadProcessId
function 来检索创建窗口的进程的ID,给定该窗口的HWND
。
下面是一个简短的 C 代码 sn-p 显示如何。我们检查每个GetWindowThreadProcessId()
调用的返回值是否不为零(see this answer 或this blog by Raymond Chen),以确保我们传递了有效的HWND
句柄。
// win1 and win2 are both HWND handles to check...
DWORD proc1, proc2;
if (!GetWindowThreadProcessId(win1, &proc1)) // Error (invalid HWND?)
//.. error handling
if (!GetWindowThreadProcessId(win2, &proc2))
//..
if (proc1 == proc2)
// Windows created by same process
else
// Windows created by different processes
【讨论】:
"你可以忽略返回值" - 你不应该忽略它。至少,检查它以确保函数不会失败,即 HWND 是否不再有效。 @Remy 好的,根据 Raymond 的博客和链接的 SO 答案中提供的信息修改代码。【参考方案2】:GetWindowThreadProcessId
可以完成这项工作。记录在这里。
【讨论】:
【参考方案3】:执行此操作的交互式方法是使用 Microsoft 的 Spy++,它允许您通过指向并单击其 GUI 来查找窗口的进程 ID、线程 ID 和父/子。
您还可以通过这种方式找到窗口句柄(以及大量其他特定于窗口的数据)。
【讨论】:
以上是关于如何识别窗口是不是属于特定进程?的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 中,如何使用 C++ 或 C# 在属于另一个进程的窗口中突出显示文本?
阻止特定进程的 Windows 错误报告 (DW20.exe) 窗口