VC2008获取指定的窗口句柄
每每编程时都要和窗口句柄hWnd打交道,如果只是MFC的程序还好说this->m_hWnd就解决了,这也只是当前窗口的句柄而已,都说家花哪有野花香,不费力的事情好像不太给力,给点难度对于我们这些初学者来说还是有点成就感的
下面有参考MSDN和网上的资料:
一、
HWND
这种方法最直接了,不过两参数中有一个不太好得到,WindowName就是窗口名,也就是窗口程序运行时任务栏上显示的;窗口的ClassName一般是看不到了,也就是这个最纠结了。如果当前只运行同一窗口程序的一个实例,就可以直接
::FindWindow(NULL,
二、
HANDLE WINAPI CreateToolhelp32Snapshot
BOOL WINAPI Process32First( __in HANDLE hSnapshot, __in_out LPPROCESSENTRY32 lppe);
BOOL WINAPI Process32Next( __in HANDLE hSnapshot, __out LPPROCESSENTRY32 lppe);
这三个API函数配合使用 结构体PROCESSENTRY32可以参考MSDN
先定义一个全局变量,类中的全局变量就可以
HWND SpecialhWnd;
//枚举窗口回调
//hwnd窗口句柄 lParam指定的进程ID
BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam)
{
}
EnumWindow
BOOL
//进程快照枚举进程 lpszProcName指定进程名
void CXXXXXDlg::GethWndByProc32SnapShot(TCHAR* lpszProcName)
{
}
以上两种方法都有个不足就是,如果同时运行一个程序多个实例时,无论窗口名还是进程名都会有相同的好几个,这样第二种方法就只能获取到其中的一个,因为保存句柄的全局变量被重新赋值。
当然不是没有解决的方法,可以将保存句柄的变量定义成一个数组,也就是HWND hWnd[ nsize ];数组的大小自己控制,并定义一个局部的计数器,当有符合条件的句柄时就保存到句柄数组中去。
回调的实现也就是下面那样了:
//枚举窗口回调
//hwnd窗口句柄 lParam指定的进程ID
BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam)
{
int count = 0;
}
这样同一程序的不同实例的窗口句柄都可以得到,不过该怎么去区分它们?
解决的方法总是有的,加上一组只能唯一的识别号,进程ID或许可以
除了使用二组数组,还有一种方法就是使用容器,因为不是很理解,这里也不好写下去了,能捧场的多留点口水,实在是想多学点
在网上也还见到过其他方法的,有兴趣的可以去找找,可以自己动动手实践一下
引文来源