2016-03-23 93 views
-1

我正在寫一個插件。我只允許從衍生主線程運行代碼。我無法在主線程上運行代碼。獲取主線程的線程號

從我的線程,是否有可能獲得主線程的線程ID?

我以爲OpenProcess這樣做 - 但它似乎矯枉過正,因爲我的線程過程是相同的。

/* CAUTION: ONLY WIN32 
* get the threadId of the main thread of a target process 
* 
* params: 
*  DWORD pId processId of the target process 
* 
* return: 
*  Success  threadId 
*  Error  NULL 
*/ 
DWORD GetMainThreadId(DWORD pId) 
{ 
    LPVOID lpThId; 

    _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; 
    if(ReadProcessMemory(hProcess, lpThId, &tId, sizeof(tId), NULL) == FALSE) 
    { 
     CloseHandle(hProcess); 
     return NULL; 
    } 

    CloseHandle(hProcess); 

    return tId; 
} 

有什麼更好的辦法嗎?

+0

FWIW,考慮到問題中的代碼,我沒有理由期望在目標進程中的該地址找到線程ID。我認爲你的代碼看起來工作的確很巧合。 –

回答

2

首先,您需要定義主線程的含義。該系統本身沒有這樣的概念。

通常,當你說主線程時,你的意思是創建主應用程序窗口的線程。所以,找到主要的應用程序窗口。然後通過該窗口GetWindowThreadProcessId

+0

啊,這是一個好主意,非常感謝您的即時回覆!我認爲我可能遇到的問題是我的代碼在創建窗口之前運行:( – Noitidart

+1

)通常,可能會創建這些窗口的線程尚未創建,但它不一定是線程創建進程時創建的,這將創建窗口。 –

+0

啊非常非常好的一點。謝謝! – Noitidart