您的位置:首页 > 其它

win32 获取窗口句柄的方法

2013-12-25 12:37 423 查看

win32获取窗口句柄的方法


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


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

HWNDhWnd=(HWND)0x00280726;

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

HWNDFindWindow(LPCTSTRlpClassName,LPCTSTRlpWindowName)可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。

HWNDFindWindowEx(HWNDhwndParent,HWNDhwndChildAfter,LPCTSTRlpClassName,LPCTSTRlpWindowName)

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

BOOLGetCursorPos(LPPOINTlpPoint)//获取当前光标的位置,得到的坐标是以屏幕坐标表示

HWNDWindowFromPoint(POINT&Point)

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

BOOLCALLBACKEnumWindows(WNDENUMPROClpEnumFunc,LPARAMlParam)

BOOLCALLBACKEnumWindowsProc(HWNDhwnd,LPARAMlParam)

BOOLCALLBACKEnumChildProc(HWNDhwnd,LPARAMlParam)

BOOLCALLBACKEnumChildWindows(HWNDhWndParent,WNDENUMPROClpEnumFunc,LPARAMlParam)

例子:#include<iostream>

#include<windows.h>

usingnamespacestd;

BOOLCALLBACKMyEnumProc(HWNDhwnd,LPARAMlParam)

{

charszTitle[100];

memset(szTitle,0,sizeof(szTitle));

GetWindowText(hwnd,szTitle,100);

if(!strcmp(szTitle,"QQ2013"))

{

MessageBox(NULL,szTitle,szTitle,0);

returnFALSE;

}

returnTRUE;

}

intmain()

{

BOOLret=EnumWindows(MyEnumProc,0);//调用EnumWindows,传入MyEnumProc的函数地址作为第一个参数,

return0;

}

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

HANDLEGetProcessHandle(intnID)//通过进程ID获取进程句柄

{

returnOpenProcess(PROCESS_ALL_ACCESS,FALSE,nID);

}

HANDLEGetProcessHandle(LPCTSTRpName)//通过进程名获取进程句柄

{

HANDLEhSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

if(INVALID_HANDLE_VALUE==hSnapshot)

{

returnNULL;

}

PROCESSENTRY32pe={sizeof(pe)};

BOOLfOk;

for(fOk=Process32First(hSnapshot,&pe);fOk;fOk=Process32Next(hSnapshot,&pe))

{

if(!_tcscmp(pe.szExeFile,pName))

{

CloseHandle(hSnapshot);

returnGetProcessHandle(pe.th32ProcessID);

}

}

returnNULL;

}

VC由进程ID获取窗口句柄


HWNDGetWindowHandleByPID(DWORDdwProcessID)
{
HWNDh=GetTopWindow(0);
while(h)
{
DWORDpid=0;
DWORDdwTheardId=GetWindowThreadProcessId(h,&pid);
if(dwTheardId!=0)
{
if(pid==dwProcessID/*yourprocessid*/)
{
//herehisthehandletothewindow
returnh;
}
}
h=GetNextWindow(h,GW_HWNDNEXT);
}
returnNULL;
}
HWNDGetHwndByPid(DWORDProcessId)//进程ID取窗口句柄
{
WINDOWINFOWinInfo1[255];
HWND_hwnd=0;
DWORDaa=EnumWindowInfo(WinInfo1);
for(inti=0;i<aa;i++)
{
if(WinInfo1[i].dwProcessId==ProcessId)
{
_hwnd=WinInfo1[i].hwnd1;
if(0==::GetWindowLong(WinInfo1[i].hwnd1,GWL_HWNDPARENT))
{
returnWinInfo1[i].hwnd1;
}
}
}
return_hwnd;
}


回调函数找

typedefstructtagWNDINFO

{

DWORDdwProcessId;

HWNDhWnd;

}WNDINFO,*LPWNDINFO;

BOOLCALLBACKYourEnumProc(HWNDhWnd,LPARAMlParam)

{

DWORDdwProcessId;

GetWindowThreadProcessId(hWnd,&dwProcessId);

LPWNDINFOpInfo=(LPWNDINFO)lParam;

if(dwProcessId==pInfo->dwProcessId)

{

pInfo->hWnd=hWnd;

returnFALSE;

}

returnTRUE;

}

HWNDGetProcessMainWnd(DWORDdwProcessId)

{

WNDINFOwi;

wi.dwProcessId=dwProcessId;

wi.hWnd=NULL;

EnumWindows(YourEnumProc,(LPARAM)&wi);

returnwi.hWnd;

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