在DLL中獲取主進程窗口句柄

有的時候不免須要在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
相關文章
相關標籤/搜索