GetWindowThreadProcessId 返回什么?

Gre*_*edo 0 winapi

DWORD GetWindowThreadProcessId(
  HWND    hWnd,
  LPDWORD lpdwProcessId
);
Run Code Online (Sandbox Code Playgroud)

根据文档,返回值是创建窗口的线程的标识符。这意味着什么?

我想我只是想知道 threadID 与 processID 有什么关系,它是什么以及它的用途是什么 - 它是否以某种方式验证 processID?我想丢弃它,因为 processID 就是我想要的。

IIn*_*ble 5

预先解决字面上的问题,GetWindowThreadProcessId

[r]检索创建指定窗口的线程的标识符,以及创建该窗口的进程的标识符(可选)。

只要您了解潜在的关系,这是相当不言自明的:

  • Windows 由线程拥有。当一个线程创建一个窗口时,两者就进入了一种不可分割的关系,这种关系一直持续到窗口被销毁为止。
  • 线程由进程拥有。一旦线程在特定进程中创建,它就属于该进程,直到该进程终止。

换句话说:每个窗口都由单个线程拥有,而该线程又属于单个进程。这种关系在窗口的生命周期内是固定的。


文档中谈到“标识符”,听起来似乎很明确。情况并非如此,因为系统提供了两种不同的方式来识别线程(或进程):通过 ID 和通过句柄。

ID(由该 API 返回)只是数值,例如 value 42。它们可以自由传递、由命令行工具返回或提供给命令行工具等等。它们没有任何附加条件。由此推论,特定值的含义会​​随着时间而变化。

另一方面,句柄与实际对象相关联。只要客户端持有句柄,系统就会使引用的对象保持活动状态。因此,引用的对象不会改变,从而允许客户端对生命周期做出假设。