获取主线程的线程ID

时间:2016-03-23 15:53:24

标签: multithreading winapi

我正在写一个插件。我只允许从生成的主线程运行代码。我无法在主线程上运行代码。

从我的主题,是否有可能获得主线程的线程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;
}

还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

首先,您需要定义主线程的含义。系统本身没有这样的概念。

通常,当你说主线程时,你的意思是创建主应用程序窗口的线程。所以,找到主应用程序窗口。然后将该窗口传递给GetWindowThreadProcessId