2013-01-05 47 views
-2

我想獲得一個進程的主線程ID,我看到有2種方法:GetWindowThreadProcessID和使用TIB獲取線程ID有什麼區別?

第一是使用線程ID = GetWindowThreadProcessId(HWND,NULL)這hWnd爲我們從

要進程的句柄二是使用

_asm 
    { 
     mov eax, fs:[18h] 
     add eax, 36 
     mov [lpThId], eax 
    } 

    HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, pId); 
    if(hProcess == NULL) 
     return NULL; 

    DWORD tId; 
    ReadProcessMemory(hProcess, lpThId, &tId, sizeof(tId), NULL) == FALSE) 

那麼有什麼區別?

+0

'GetWindowThreadProcessId'不在進程句柄上運行。我想如果你閱讀'GetWindowThreadProcessId'的文檔,那麼你會看到這兩個代碼的不同之處。您應該問的問題是:*我如何獲得進程的主線程ID?* –

+1

@David:Windows進程沒有_main thread_的概念。同樣,Windows進程也沒有_main window_。所以唯一的問題'GetWindowThreadProcessId'可以回答:哪個線程擁有一個特定的窗口,以及 - 可選的 - 哪個進程擁有這個線程。 SieuTruc應該明確指出他正在努力解決的問題。你和他的問題都無法回答。 – IInspectable

+0

其中,您假設郵件線程仍然存在。 –

回答

2

從MSDN GetWindowThreadProcessId

檢索的線程的標識符創建指定的窗口和任選地,創建窗口的過程的標識符。

它與TIB無關。不同的是,這兩個是不同的標識符,這可能相當於一個巧合。

+0

那麼,對於簡單的窗口應用來說,它們往往具有相同的價值嗎?因爲線程創建的窗口也是主線程?這樣對嗎 ? – SieuTruc

+0

如果您的代碼位於創建感興趣的窗口的線程上,它們就會匹配。它不一定是「主」線程。 –

相關問題