有的時候不免須要在DLL中獲取主進程的窗口句柄,好比在DLL注入的時候等等。那麼如何在DLL中獲取主進程的窗口句柄呢?能夠經過EnumWindows來實現。先經過GetCurrentProcessId獲取進程的PID,而後在EnumWindows中調用GetWindowThreadProcessId得到與窗口句柄關聯的進程PID,而後對比PID,看是否相等,並判斷是否是主窗口便可。html
#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; } Copyed From 程序人生 Home Page:http://www.programlife.net Source URL:http://www.programlife.net/get-main-window-handler-in-dll.html