Win32 - Get Main Wnd应用程序句柄

时间:2011-06-01 14:09:35

标签: c++ windows winapi

我已经注入了我的dll。 如何获取主机应用程序的主窗口句柄?

1 个答案:

答案 0 :(得分:34)

主机应用程序可能有多个“主窗口”。要检测它们,你可以

  1. 致电GetCurrentProcessId以获取当前流程的PID
  2. 调用EnumWindows迭代桌面的所有顶级窗口
  3. 对于桌面上的每个窗口,调用GetWindowThreadProcessId以获取创建窗口的进程的PID
  4. 如果窗口的PID与您自己进程的PID匹配,请记住窗口。
  5. 它为您提供了一个由您注入DLL的进程创建的顶层窗口列表。但请注意,这种方法可能会产生窗口,这些窗口在您处理构建的窗口列表时已被破坏。因此,在使用Windows执行某些操作时,请确保使用IsWindow函数以确保手头的窗口仍然有效(由于窗口在您对{{{{{{ 1}}并实际访问窗口,但时间窗口要小得多。)

    这是实现此算法的C ++函数。它实现了一个IsWindow函数,它产生一个getToplevelWindows,包含当前进程的所有顶层窗口的句柄。

    std::vector<HWND>

    更新:这些天(我给出答案后大约四年)我还会考虑应用程序的traversing the list of threads,然后在每个线程上使用EnumThreadWindows。我注意到在很多情况下这种情况要快得多。