GetWindowThreadProcessId返回值是什么?线程ID与进程ID有何关联?
GetWindowThreadProcessId 核心说明
函数定义
DWORD GetWindowThreadProcessId( HWND hWnd, LPDWORD lpdwProcessId );
问题解答
- 返回值“创建指定窗口的线程标识符”的具体含义
Windows系统中所有窗口都归属于创建它的UI线程,这个返回值就是该UI线程的系统全局唯一ID。只有这个线程可以直接处理窗口消息、修改窗口属性,其他线程操作该窗口必须走跨线程消息投递逻辑,不能直接调用窗口操作接口。 - 线程ID与进程ID的关联和各自作用
- 关联:二者是所属关系,返回的线程是输出的进程ID对应进程内的运行线程,每个Windows进程至少包含一个运行线程,该线程的所有资源都归属于对应进程。
- 进程ID作用:作为进程的全局唯一标识,可用于打开进程句柄、查询进程资源占用、终止进程、读写进程内存等操作。
- 线程ID作用:作为线程的全局唯一标识,可用于给对应线程投递窗口消息、挂起/恢复线程、调整线程调度优先级、查询线程运行状态等操作,所有针对该窗口的消息类操作都需要用到这个线程ID。
- 线程ID无法校验进程ID的有效性
Windows的进程ID和线程ID是独立分配的,且ID会在进程/线程退出后被系统回收复用。哪怕你拿到的线程ID当前有效,也不能证明对应的进程ID是有效的,反之也成立。要校验进程ID的有效性,只能通过OpenProcess尝试打开该ID,查看返回句柄是否合法,必要时还要匹配进程名等信息避免ID复用导致的误判。 - 仅需进程ID时可以直接忽略返回的线程ID
只要你传入的hWnd是合法窗口句柄,且lpdwProcessId指向有效的内存地址,函数就会自动把对应进程ID写入该地址,不管你是否处理返回的线程ID都不会影响这个结果。但要注意:函数返回值为0代表调用失败,此时lpdwProcessId存储的是无效脏数据,哪怕你不需要线程ID,也建议判断返回值是否非0再使用拿到的进程ID。
内容的提问来源于stack exchange,提问作者Greedo
相关产品推荐
相关产品推荐

