我已经注入了我的dll。 如何获取主机应用程序的主窗口句柄?
答案 0 :(得分:34)
主机应用程序可能有多个“主窗口”。要检测它们,你可以
GetCurrentProcessId
以获取当前流程的PID EnumWindows
迭代桌面的所有顶级窗口GetWindowThreadProcessId
以获取创建窗口的进程的PID 它为您提供了一个由您注入DLL的进程创建的顶层窗口列表。但请注意,这种方法可能会产生窗口,这些窗口在您处理构建的窗口列表时已被破坏。因此,在使用Windows执行某些操作时,请确保使用IsWindow
函数以确保手头的窗口仍然有效(由于窗口在您对{{{{{{ 1}}并实际访问窗口,但时间窗口要小得多。)
这是实现此算法的C ++函数。它实现了一个IsWindow
函数,它产生一个getToplevelWindows
,包含当前进程的所有顶层窗口的句柄。
std::vector<HWND>
更新:这些天(我给出答案后大约四年)我还会考虑应用程序的traversing the list of threads,然后在每个线程上使用EnumThreadWindows
。我注意到在很多情况下这种情况要快得多。