在DLL中获取主进程窗口句柄

来源:互联网 发布:软件学报 ei 编辑:程序博客网 时间:2024/05/18 02:35
有的时候难免需要在DLL中获取主进程的窗口句柄,比如在DLL注入的时候等等。那么如何在DLL中获取主进程的窗口句柄呢?可以通过EnumWindows来实现。先通过GetCurrentProcessId获取进程的PID,然后在EnumWindows中调用GetWindowThreadProcessId获得与窗口句柄关联的进程PID,然后对比PID,看是否相等,并判断是不是主窗口即可。
以上方法参考自网络,不一定很完善,但是通常情况下已经够用了。附上测试代码:
// Author: 代码疯子// Blog: http://www.programlife.net/#include <windows.h> BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { DWORD dwCurProcessId = *((DWORD*)lParam); DWORD dwProcessId = 0;  GetWindowThreadProcessId(hwnd, &dwProcessId); if(dwProcessId == dwCurProcessId && GetParent(hwnd) == NULL){ *((HWND *)lParam) = hwnd;return FALSE; } return TRUE; }   HWND GetMainWindow() { DWORD dwCurrentProcessId = GetCurrentProcessId();if(!EnumWindows(EnumWindowsProc, (LPARAM)&dwCurrentProcessId)) {     return (HWND)dwCurrentProcessId; } return NULL; }  BOOLEAN WINAPI DllMain(IN HINSTANCE hDllHandle, IN DWORD     nReason,    IN LPVOID    Reserved){BOOLEAN bSuccess = TRUE; switch ( nReason ){case DLL_PROCESS_ATTACH:MessageBox(GetMainWindow(), TEXT("OMG~ You are Attacked!"), TEXT("Warning"), MB_ICONWARNING);break; case DLL_PROCESS_DETACH:break;} return bSuccess;}

0 0
原创粉丝点击