如何根据进程id获取该进程的主窗口句柄

来源:https://blog.csdn.net/zero_226/article/details/50887014

最近刚好有个功能,需要这个逻辑,话不多说,上代码。

 

  1.  struct handle_data {
  2.  unsigned long process_id;
  3.  HWND best_handle;
  4.  };
  5.   
  6.  BOOL IsMainWindow(HWND handle)
  7.  {
  8.  return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle);
  9.  }
  10.   
  11.   
  12.  HWND FindMainWindow(unsigned long process_id)
  13.  {
  14.  handle_data data;
  15.  data.process_id = process_id;
  16.  data.best_handle = 0;
  17.  EnumWindows(EnumWindowsCallback, (LPARAM)&data);
  18.  return data.best_handle;
  19.  }
  20.   
  21.  BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam)
  22.  {
  23.  handle_data& data = *(handle_data*)lParam;
  24.  unsigned long process_id = 0;
  25.  GetWindowThreadProcessId(handle, &process_id);
  26.  if (data.process_id != process_id || !IsMainWindow(handle)) {
  27.  return TRUE;
  28.  }
  29.  data.best_handle = handle;
  30.  return FALSE;
  31.  }

然后main函数,这样调用即可,

 

HWND hwnd = FindMainWindow(uProcessID);

这个uProcessID就是任务管理器里PID一列的内容,你也可以写个函数用进程名来获取。

posted @ 2020-11-05 14:45  宇宙之外  阅读(2693)  评论(0编辑  收藏  举报