EnumWindows 函数怎么让用户自定义参数呢? 本帖最后由 VisualEleven 于 2012-12-23 17:42:28 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ::EnumWindows(EnumWindowsProc,"无标题 - 记事本");BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM ){ int nLen = ::GetWindowTextLength(hwnd) + 1; LPTSTR Caption = new TCHAR[nLen]; ::GetWindowText(hwnd, Caption, nLen);TCHAR szBuf[256]={0}; if (!::lstrcmp(Caption,(const char*)lParam)) { // cout << (long)hwnd << endl;char szTmp[20]; wsprintf(szTmp,_T("%d|"),(HWND)hwnd);wsprintf(szTmp,_T("%c|"),Caption); strcat(szBuf,szTmp);}szBuf[strlen(szBuf)]='\0';delete[] Caption; return TRUE;} EnumWindows的第2个参数,就是传递给EnumWindowsProc的,可以自定义.另外我给一个其他方式的实现代码吧,不需要回调函数了,在某些情况下方便些:void MyFindWindow(LPCTSTR lpName){ HWND hWnd=::FindWindowEx(NULL,NULL,NULL,lpName); While(hWnd){ //这个hWnd就是你要的了 //查找下一个符合条件的窗口 hWnd=::FindWindowEx(NULL,hWnd,NULL,lpName); }}//调用MyFindWindow(_T("无标题 - 记事本"));sign----------------------------------------------------------------------- EnumWindows不是有个参数吗?第二个参数LPARAM参数,可以传递你想要传递的数据。 这个方法不好,比如你打开了2个 单文档程序, 都会有“无标题1“之类的标题文字可以说findwindow似乎不能应对子窗口的。enumwindow才是王道 请不要似乎,这是我测试并且在多个地方使用过的代码.另外,我用的FindWindowEx,不是FindWindow,这两者是不一样的.sign----------------------------------------------------------------------- 就以本贴的用途来说,楼主是用EnumWindows枚举全部顶级窗口,之后再取每个窗口的标题,找到符合自己需求的.那么我在2楼给的代码,就可以直接在FindWindowEx的最后一个参数传递窗口标题,只查找符合需求的全部顶级窗口.如果要枚举子窗口(EnumChildWindows),FindWindowEx的第一个参数传递父窗口句柄就可以了.当然,我并不是说FindWindowEx就一定比EnumWindows、EnumChildWindows更好,只是多一种实现方法而已,根据自己的需求去选择.比如枚举之后需要判断类名、窗口标题的,那我可以直接在FindWindowEx传递参数,而不需要再次GetClassName、GetWindowText比如我在某个类里面需要枚举窗口时,不需要回调函数会方便一些(普通的类成员函数不能当回调函数)sign----------------------------------------------------------------------- 谢谢楼上各位朋友 我已经解决了这个问题现在出现了新的问题 是 怎么把EnumWindows 函数执行完后,把得到的句柄接收回来,我上面给出的代码 不能接收,需要把TCHAR szBuf[256]={0}; 这句拉到函数外边去,这样能接收但还是有问题,我在VC中测试 每次都返回正确的句柄,但我写成DLL给其他软件调用 出现了句柄重复跌加的情况,就是第一次调试是三个句柄,第二次6个 第三次9个,不过是重复的不知道是哪里有问题,懂的朋友请指点一下,谢谢 有没有巨牛,这个东西有些冷门,资料不多 关于TTS的几个问题,大家帮忙哦,急急急!!! 求VC下实现计算器功能的小程序? 菜鸟问个土的关于CListBox的问题 串口通讯问题,麻烦下载代码帮忙看看 如何创建动态菜单的子菜单(附代码) VC中如何得到一个变量的物理地址? 送分题 :小键盘对应的码值,用于运算器。 请问腾讯OICQ是用什么写的?JAVA? vc++??????? MFC控件 SHGetFileInfo得到的图标句柄 却无法正常显示在CListCtrl 中 求9 opengl导入的3d文件的物体,如何修改局部坐标系
BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM )
{ int nLen = ::GetWindowTextLength(hwnd) + 1; LPTSTR Caption = new TCHAR[nLen];
::GetWindowText(hwnd, Caption, nLen);
TCHAR szBuf[256]={0};
if (!::lstrcmp(Caption,(const char*)lParam))
{
// cout << (long)hwnd << endl;
char szTmp[20];
wsprintf(szTmp,_T("%d|"),(HWND)hwnd);
wsprintf(szTmp,_T("%c|"),Caption);
strcat(szBuf,szTmp);
}
szBuf[strlen(szBuf)]='\0';
delete[] Caption;
return TRUE;
}
另外我给一个其他方式的实现代码吧,不需要回调函数了,在某些情况下方便些:
void MyFindWindow(LPCTSTR lpName)
{
HWND hWnd=::FindWindowEx(NULL,NULL,NULL,lpName);
While(hWnd){
//这个hWnd就是你要的了
//查找下一个符合条件的窗口
hWnd=::FindWindowEx(NULL,hWnd,NULL,lpName);
}
}
//调用
MyFindWindow(_T("无标题 - 记事本"));sign-----------------------------------------------------------------------
这个方法不好,比如你打开了2个 单文档程序, 都会有“无标题1“之类的标题文字可以说findwindow似乎不能应对子窗口的。enumwindow才是王道
另外,我用的FindWindowEx,不是FindWindow,这两者是不一样的.
sign-----------------------------------------------------------------------
那么我在2楼给的代码,就可以直接在FindWindowEx的最后一个参数传递窗口标题,只查找符合需求的全部顶级窗口.
如果要枚举子窗口(EnumChildWindows),FindWindowEx的第一个参数传递父窗口句柄就可以了.当然,我并不是说FindWindowEx就一定比EnumWindows、EnumChildWindows更好,只是多一种实现方法而已,根据自己的需求去选择.
比如枚举之后需要判断类名、窗口标题的,那我可以直接在FindWindowEx传递参数,而不需要再次GetClassName、GetWindowText
比如我在某个类里面需要枚举窗口时,不需要回调函数会方便一些(普通的类成员函数不能当回调函数)
sign-----------------------------------------------------------------------