您的位置:首页 > 其它

win32 获取窗口句柄的方法

2013-05-05 21:00 387 查看
第一种方法是根据窗口句柄值获取窗口句柄

使用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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: