win32 获取窗口句柄的方法

第一种方法是根据窗口句柄值获取窗口句柄

使用spy++获取指定窗口的窗口句柄值,因为句柄值是16进制数,所以前面加0x,然后进行强制转换为HWND类型。

HWND hWnd=(HWND)0x00280726;

第二种方法是使用FindWindow或者FindWindowEx根据窗口类名和窗口标题找到相应的窗口句柄

HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)    可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。
 HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)

第三种方法是获得当前鼠标位置的窗口句柄

BOOL GetCursorPos(LPPOINT lpPoint) //获取当前光标的位置,得到的坐标是以屏幕坐标表示
 HWND WindowFromPoint(POINT& Point)

 第四种方法是枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。

BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam) 
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) 
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)

 例子:

#include <iostream>
 #include <windows.h>
 using namespace std;
 BOOL CALLBACK MyEnumProc(HWND hwnd,LPARAM lParam)
 {
  char szTitle[100];
  memset(szTitle,0,sizeof(szTitle));
  GetWindowText(hwnd,szTitle,100);
  if(!strcmp(szTitle,"QQ2013"))
  {
   MessageBox(NULL,szTitle,szTitle,0);
   return FALSE;
  }
  return TRUE;
 }
 int main()
 {
   BOOL ret=EnumWindows(MyEnumProc,0);//调用EnumWindows,传入MyEnumProc的函数地址作为第一个参数,
    return 0;
 }

 第五种方式根据进程名或进程ID获取窗口句柄

HANDLE GetProcessHandle(int nID)//通过进程ID获取进程句柄 
  
 { 
  
 return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID); 
  
 } 
  
 
 
HANDLE GetProcessHandle(LPCTSTR pName)//通过进程名获取进程句柄
 {
  HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (INVALID_HANDLE_VALUE == hSnapshot) 
  {
   return NULL;
  }
  PROCESSENTRY32 pe = { sizeof(pe) };
  BOOL fOk;
  for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
  {
   if (!_tcscmp(pe.szExeFile, pName)) 
   {
    CloseHandle(hSnapshot);
    return GetProcessHandle(pe.th32ProcessID);
   }
  }
  return NULL;
 }

 VC由进程ID获取窗口句柄 

HWND GetWindowHandleByPID(DWORD dwProcessID) 
{ 
 HWND h = GetTopWindow(0);     
 while ( h )     
 { 
  DWORD pid = 0; 
        DWORD dwTheardId = GetWindowThreadProcessId( h,&pid);  
  if (dwTheardId != 0)    
  { 
   if ( pid == dwProcessID/*your process id*/ )            
            { 
                // here h is the handle to the window                
    return h;  
            }       
        }   
  h = GetNextWindow( h , GW_HWNDNEXT);     
    }
 return NULL; 
} 
HWND GetHwndByPid(DWORD ProcessId)//进程ID取窗口句柄     
{             
 WINDOWINFO WinInfo1[255];      
 HWND _hwnd=0;      
 DWORD aa=EnumWindowInfo(WinInfo1);      
 for(int i=0;i<aa;i++)      
 {      
  if (WinInfo1[i].dwProcessId==ProcessId)      
  {      
   _hwnd=WinInfo1[i].hwnd1;      
   if (0 ==::GetWindowLong(WinInfo1[i].hwnd1,GWL_HWNDPARENT))      
   {      
    return WinInfo1[i].hwnd1; 
   }      
  }      
 }      
 return _hwnd;             
}

回调函数找 

typedef struct tagWNDINFO 
 {  
  DWORD dwProcessId;  
  HWND hWnd;  
 } WNDINFO, *LPWNDINFO;   
 BOOL CALLBACK YourEnumProc(HWND hWnd,LPARAM lParam)  
 {  
  DWORD dwProcessId;  
  GetWindowThreadProcessId(hWnd, &dwProcessId); 
  LPWNDINFO pInfo = (LPWNDINFO)lParam; 
  
  if(dwProcessId == pInfo->dwProcessId) 
  {  
   pInfo->hWnd = hWnd;   
   return FALSE;  
  }  
  return TRUE; 
 }   
 HWND GetProcessMainWnd(DWORD dwProcessId)  
 {  
  WNDINFO wi;  
  wi.dwProcessId = dwProcessId;  
  wi.hWnd = NULL;  
  EnumWindows(YourEnumProc,(LPARAM)&wi); 
  return wi.hWnd; 
 }