参考: wine 8.14
-
windows 介绍
https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowthreadprocessid
GetWindowThreadProcessId,功能是获取创建窗口的thread id, 如果需要的话,也可以获取创建窗口的process id.
-
源码分析
DWORD get_window_thread(HWND hwnd, DWORD *process)
{
WND *ptr;
DWORD tid = 0;
if(!(ptr = get_win_ptr(hwnd)))
{
......
}
if(ptr != WND_OTHER_PROCESS && ptr != WND_DESKTOP)
{
tid = ptr->tid;
if(process) *process = GetCurrentProcessId();
......
return tid;
}
SERVER_START_REQ(get_window_info)
{
req->handle = wine_server_user_handle(hwnd);
if(!wine_server_call_err(req))
{
tid = (DWORD)reply->tid;
if(process) *process = (DWORD)reply->tid;
}
}
SERVER_END_REQ;
return tid;
}
此函数用于获取创建窗口的线程id,当参数process不为NULL时,process返回的是pid。由于tid 是WND 结构体的成员,我们需要调用函数get_win_ptr来获取窗口handle对应的WND结构体。在wine中,会以窗口handle为index,将WND结构体存入user_handles数组,详见函数create_window_handle。在wine中窗口可以由桌面窗口创建,可以由调用此函数的线程创建,还可以由其它进程创建。因此就存在WND_OTHER_PROCESS 与WND_DESKTOP的判断,以及通过server 来获取其它进程信息的情况。