c++ - 如何获取进程的主线程 ID(通过其 ID 知道)?

标签 c++ c windows multithreading

你能帮我找到给定 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, 0); // close your eyes...
  }

  return (0 != dwMainThreadID);
}

关于c++ - 如何获取进程的主线程 ID(通过其 ID 知道)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15597066/

相关文章:

c++ - 如何访问在 C++ 中定义在不同类中的变量

C90 编译器提示没有原型(prototype)函数警告

python - 在 Python 脚本中运行批处理文件时出现 Windows 错误 2

c++ - 我如何构建我的 C++ 代码,以便我只编写一次常用方法?

c++ - 为什么 C++ 标准库中没有 std::thread_pool ?

c++ - 编写一个递归函数来乘以 2 个整数

c - Valgrind 报告

c - 试图从字符串中提取复数

linux - 当文件夹存在时,smbclient 树连接失败 nt_status_bad_network_name

mysql - 如何在裸 Windows 7 安装上查看 .text 中的行终止符