如何获取进程的主线程标识(由其ID标识)?

你能帮我find一个ID进程的主(唯一)线程ID吗?

任务上下文:正在运行的进程(目前)没有窗口,而是(某些)线程。

通缉:仅在主线程中发布WM_QUIT

不想要的:在非主线程上使用TerminateProcess或发送WM_QUIT

Solutions Collecting From Web of "如何获取进程的主线程标识(由其ID标识)?"

 #ifndef MAKEULONGLONG #define MAKEULONGLONG(ldw, hdw) ((ULONGLONG(hdw) << 32) | ((ldw) & 0xFFFFFFFF)) #endif #ifndef MAXULONGLONG #define MAXULONGLONG ((ULONGLONG)~((ULONGLONG)0)) #endif bool CloseProcessMainThread(DWORD dwProcID) { DWORD dwMainThreadID = 0; ULONGLONG ullMinCreateTime = MAXULONGLONG; HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (hThreadSnap != INVALID_HANDLE_VALUE) { THREADENTRY32 th32; th32.dwSize = sizeof(THREADENTRY32); BOOL bOK = TRUE; for (bOK = Thread32First(hThreadSnap, &th32); bOK; bOK = Thread32Next(hThreadSnap, &th32)) { if (th32.th32OwnerProcessID == dwProcID) { HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION, TRUE, th32.th32ThreadID); if (hThread) { FILETIME afTimes[4] = {0}; if (GetThreadTimes(hThread, &afTimes[0], &afTimes[1], &afTimes[2], &afTimes[3])) { ULONGLONG ullTest = MAKEULONGLONG(afTimes[0].dwLowDateTime, afTimes[0].dwHighDateTime); if (ullTest && ullTest < ullMinCreateTime) { ullMinCreateTime = ullTest; dwMainThreadID = th32.th32ThreadID; // let it be main... :) } } CloseHandle(hThread); } } } #ifndef UNDER_CE CloseHandle(hThreadSnap); #else CloseToolhelp32Snapshot(hThreadSnap); #endif } if (dwMainThreadID) { PostThreadMessage(dwMainThreadID, WM_QUIT, 0, 0); // close your eyes... } return (0 != dwMainThreadID); } 

获得主线程的线程ID的一个简单而可靠的方法是让主线程使用::GetCurrentThreadId()将自己的线程ID记录到一个共享的全局变量中,或许在你的WinMain或者你的开始的某个地方'主线':

 MainThreadId_G = ::GetCurrentThreadId(); 

那么在你的其他线程中,你可以调用::PostThreadMessage(MainThreadId_G, WM_QUIT, returncode, 0);

您不能将消息发布到特定的线程。 消息放入队列中,仅从主线程处理。

如果你想关闭具有UI的窗口进程,看看使用sendmessage发送wm_close到另一个进程

我已经检查了如何在MFC中处理,它看起来像UI线程是从构造函数确定的:

 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\appcore.cpp: CWinApp::CWinApp(LPCTSTR lpszAppName) { ... m_nThreadID = ::GetCurrentThreadId(); 

并使用MFC调用AfxGetApp()->m_nThreadID你可以找出UI线程ID。

然而,如果.dll不是从主线程加载的话,这种方法是行不通的 – 那么即使MFC的方法也不行 – AfxGetApp()->m_nThreadID将会返回除主线程以外的东西。

但通常您的.dll从主线程加载,但您的.dll不是必要的mfc启用。 我可以推荐这样的方法:

 class GetMainThread { public: GetMainThread() { m_nThreadID = ::GetCurrentThreadId(); } DWORD m_nThreadID; }getMainThread; DWORD getUIThread() { DWORD id = 0; if( AfxGetApp() != NULL ) id = AfxGetApp()->m_nThreadID; else id = getMainThread.m_nThreadID; return id; } //getUIThread 

如果.dll由主UI线程加载,您将从构造函数调用(GetMainThread类)中获得正确的线程ID。

删除AfxGetApp()调用,如果你不需要它们(在我的应用程序,我需要这些)