在dll中,我们或多或少的需要获取加载dll的当前窗口的句柄
下面就有一种方法:
通过EnumWindows枚举所有窗口在比较传入的当前进程的PID与枚举的进程的线程ID。
如果相同,这就返回枚举到的句柄,并结束枚举
GetWindowThreadProcessId哪个线程创建了这个窗口,返回的就是这个线程的id号。
代码如下
1 #include <windows.h> 2 3 HWND GetWindowHandle(); 4 BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam); 5 6 BOOL WINAPI DllMain( 7 HINSTANCE hinstDLL, // handle to the DLL module 8 DWORD fdwReason, // reason for calling function 9 LPVOID lpvReserved // reserved 10 ) 11 { 12 13 switch(fdwReason) 14 { 15 case DLL_PROCESS_ATTACH: 16 MessageBox(GetWindowHandle(),"HSDH", "DSBUDF", MB_ICONWARNING); 17 break; 18 default: 19 break; 20 } 21 22 return TRUE; 23 } 24 25 HWND GetWindowHandle()// 获取创建偶句柄 26 { 27 DWORD dwCurrentProcessId = GetCurrentProcessId(); 28 29 if(!EnumWindows(EnumWindowsProc, (LPARAM)&dwCurrentProcessId)) 30 { 31 return (HWND)dwCurrentProcessId; 32 } 33 34 return NULL; 35 } 36 37 BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)// 回调函数 38 { 39 DWORD dwCurProcessId = *((DWORD*)lParam); 40 DWORD dwProcessId = 0; 41 42 GetWindowThreadProcessId(hwnd, &dwProcessId); 43 if(dwProcessId == dwCurProcessId && GetParent(hwnd) == NULL) 44 { 45 *((HWND *)lParam) = hwnd; 46 return FALSE; 47 } 48 49 return TRUE; 50 }