你能帮我找到ID过程给定的主(唯一)线程ID吗?
任务上下文:
正在运行的进程(目前)没有窗口而是(某些)线程.
通缉:
仅在主线程上发布WM_QUIT.
未想:
使用TerminateProcess或在非主线程上发布WM_QUIT.
解决方法
#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); // close your eyes...
}
return (0 != dwMainThreadID);
}