【问题标题】: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 句柄,并且我想检查这两个窗口是否来自同一个进程,那么最好的选择是什么?

【问题讨论】:

标签: windows winapi


【解决方案1】:

您可以使用GetWindowThreadProcessId function 来检索创建窗口的进程的ID,给定该窗口的HWND

下面是一个简短的 C 代码 sn-p 显示如何。我们检查每个GetWindowThreadProcessId() 调用的返回值是否不为零(see this answerthis 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 和父/子。

    您还可以通过这种方式找到窗口句柄(以及大量其他特定于窗口的数据)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多