GetWindowThreadProcessIdreturn是什么意思?

What does Get­Window­Thread­Process­Id return?

DWORD GetWindowThreadProcessId(
  HWND    hWnd,
  LPDWORD lpdwProcessId
);

根据文档,return 值是创建 window 的线程的标识符。这是什么意思?

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

先把字面问题排除在外,GetWindowThreadProcessId

[r]etrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window.

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

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

换句话说:每个 window 都属于一个线程,而该线程又属于一个进程。这种关系在 window.

的生命周期内是固定的

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

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

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