2008-01-1823:11
1.HWNDFindWindow(LPCTSTRlpClassName,LPCTSTRlpWindowName)HWNDFindWindowEx(HWNDhwndParent,HWNDhwndChildAfter,LPCTSTRlpClassName,LPCTSTRlpWindowName)2.HWNDWindowFromPoint(POINT&Point)
3.4组语句
BOOLCALLBACKEnumChildProc(HWNDhwnd,LPARAMlParam)
BOOLCALLBACKEnumChildWindows(HWNDhWndParent,WNDENUMPROClpEnumFunc,LPARAMlParam)
BOOLCALLBACKEnumWindows(WNDENUMPROClpEnumFunc,LPARAMlParam)BOOLCALLBACKEnumWindowsProc(HWNDhwnd,LPARAMlParam)一般用途:
对于第一种,大家都很熟悉,是捕捉句柄的常规武器,FindWindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。可是对于一般群众,不一定知道所有的窗口(包括标题栏、按钮等等)的类名啊!——可以简单举例,请问你知道桌面图标的窗口的类名吗?而对于窗口标题,有可能会出现相同的标题,有两个窗口——指一个程序的两个进程,这又是个麻烦吧!好了,这个问题先放放,继续下一组。第二组,通过win32定义的POINT结构(typedefstructtagPOINT{LONGx,LONGy;}POINT),来获得当前鼠标光标位置的窗口HWND,这是最直观的武器!常规操作如下:先得到Cursor的POINT(BOOLGetCursorPos(LPPOINT)函数),再用WindowFromPoint。这样,我们几乎可以获得任何打开的有窗口的函数的HWND了!然后通过获取类名的win32api函数(intGetClassName(HWNDhWnd,LPTSTRlpClassName,intnMaxCount))得到类名——这里的lpClassName最好用字符数组地址,nMaxCount就是数组的size了,同时,这种方法解决了第一个问题的麻烦!——我可以把鼠标放在任何地方!*^_^*
第三组,这些是用来列举和处理任何窗口的超级武器!通过组合运用EnumWindows和EnumWindowsProc,EnumChildWindows与EnumChildProc,可以扫描桌面所有窗口并对之处理!我的理解:(这部分用任务驱动式教学方法——谁让小弟是老师呢!xixi)任务:得到所有的窗口的类名。
1:解决办法:
我们会先想到第三组,可以自桌面窗口开始(它是所有窗口的祖先),依次扫描,获取类名并存之。有点儿像VisualStdio的Spy++,或者Borland的WinSight32,具体办法如下:(bcb中)在主程序中,调用EnumWindows,传入YouEnumProc的函数地址作第一个参数,别忘了转换成WNDENUMPROC类型。第二参可NULL。
::EnumWindows(reinterpret_castYouEnumProc,NULL);在YouEnumProc函数中,如果第
一参HWND==NULL,就跳离(returnFALSE;),可以结束啦!然后,把类名数组准备好,得到类名,存之。返回真值,继续下一次扫描。看起来并不复杂,是一种函数递归。但是我可会解释!面啊!:p
2:解决方法:
简单、直观——自己想出来的,颇得意首先准备一个时钟,一种存类名方法(我用TMemo)在定时器处理函数中:1)得到当前cursor的点位置;2)再用WindowFromPoint;3)然后得到类名,放到TMemo里这样可以用鼠标获得你想要的窗口(包括按钮等),只要鼠标在窗口放一会儿。。。
3:解决方法:
其实利用FindWindow和循环结构也应该可以总结:其实得到HWND的方法很多,比如知道了窗口层次,依次向下扫。。。在说第三种呢!但我觉得,我的方法最直接有效,你说呢?欢迎大家与我联系,并讨论这个问题!有关这个问题我还有许多疑问,比如HWND与ID的转换,在如IE页面中的表单控件的HWND或ID,还是其他的东东,总之是能识别他的东西。。。这个我很困惑,没办法!不清楚地方,大家要参照MSDN啊!
如何获得对话框子窗口的句柄??用AfxGetMainWnd可以获得主窗口的句柄。
2006-08-1717:01
如何获得对话框子窗口的句柄??用AfxGetMainWnd可以获得主窗口的句柄。voidASEnumWnd::OnBUTTONEnumWnd(){
m_WndListBox.ResetContent();//一次清空
if(!::EnumWindows((WNDENUMPROC)enumProc,0))AfxMessageBox(\"Error\");Invalidate(true);}
//枚举当前所有窗口并显示在ListBox中.
BOOLCALLBACKenumProc(HWNDhwnd,LPARAMlParam){
if(hwnd==NULL)returnFALSE;
if(::IsWindow(hwnd)&&::IsWindowVisible(hwnd)){
TCHARszCap[255]={0};
::GetWindowText(hwnd,szCap,255);
ASEnumWnd*pDlg=(ASEnumWnd*)::FindWindow(NULL,\"程序列表\");
//?????
pDlg->m_WndListBox.AddString(szCap);}
returnTRUE;
}
我本想通过这句获得该窗口的句柄,但是程序运行总是报错,直接就终止了。ASEnumWnd*pDlg=(ASEnumWnd*)::FindWindow(NULL,\"程序列表\");是否FindWindow这样转换后丢失了一些信息?
原来是用AfxGetMainWnd实现的,现在这个对话框是通过主窗口调用显示的,所以不能再用它了。
应该换成什么呢??
FindWindow返回的是窗口句柄,你强制转换成指针了,应该HWNDhwnd;
hwnd=::FindWindow(NULL,\"程序列表\");CWnd*wnd=FromHandle(hwnd);
不能直接用GetDlgItem吗?如果如果是捕捉当前工作区的窗口可以直接用GetDlgItem取得指定控件ID的窗口指针.
如果要根据条件捕获其他进程的窗口可以做以下操作
HWNDg_hParantWnd=::FindWindow(NULL,\"程序列表\");
HWNDhWnd=::FindWindowEx(g_hParantWnd,NULL,\"AfxWnd42\NULL);
HWNDhChild=::GetDlgItem(hWnd,ID);//ID为窗口中指定控件ID,可以通过Spy++查找CListBoxx;
x.Attach(hChild);
tolegendhui(何离心之可同兮,吾将远逝以自疏)抛错:
errorC2065:'FromHandle':undeclaredidentifier使用全局函数试试::FromHandle
获得同一程序全部实例顶级窗口句柄
2007-04-2910:39
当一个含有窗口的程序只有一个运行实例的时候,可以用FindWindow函数或CWnd::FindWindow函数得到其顶级窗口句柄。
但是当这个程序有多个运行实例同时运行时,FindWindow只能返回最后一个被激活的窗口句柄。
怎样才能得到所有的运行实例呢(这样才可以像所有的实例发送消息么:)).这就要用到EnumWindows函数了。------------------------------------EnumWindows
函数功能描述:Enum顶层窗口
1.函数原形
BOOLEnumWindows(WNDENUMPROClpEnumFunc,LPARAMlParam);//某些时候调用需要采用如下强制转化:
EnumWindows((FARPROC)EnumWindowsProc,0);2.参数
WNDENUMPROClpEnumFunc:回调函数,返回值为TRUE,则继续查找;为FALSE则终止EnumWindows
LPARAMlParam:用户定义的数据3.返回值
成功返回TRUE,否则返回FALSE4.适用平台
WindowsNT/2000/XP/95/98/Me头文件:Winuser.h库文件:User32.lib.5.例子
下面代码获取所有窗口的句柄,并保存到向量里std::vector BOOLCALLBACKEnumWindowsProc(HWNDhwnd,LPARAMlParam){returng_AllWindow.push_back(hwnd),TRUE;}//Enum所有窗口,所以总返回TRUE voidGetAllWindow(){ EnumWindows(&EnumWindowProc,0);} 而这个例子可以将你所需的窗口(窗口类为CMainFrame,窗口标题包含MyWindowText)都存储起来 typedefstructWndCharacter{ charclassname[128];charwndText[128];}WNDChara; staticboolIsFindWindow(HWNDhwnd,LPARAMlParam)//如果是类函数,需要写成静态函数。 { charbuf[128]; GetClassName(hwnd,buf,sizeof(buf)); if(memcmp(buf,((WNDChara*)lParam)->classname,10)!=0)returnfalse; GetWindowText(hwnd,buf,sizeof(buf)); returnstrstr(buf,((WNDChara*)lParam)->wndText)?true:false;} std::vector BOOLCALLBACKEnumWindowsProc(HWNDhwnd,LPARAMlParam)//注意:类型是BOOL或INT,不是bool { if(IsFindWindow(hwnd,lParam)){ g_AllWindow.push_back(hwnd); } return1;//要一直return1.因为需要遍历所有的窗口,一旦返回0将停止遍历。} voidGetAllWindow(){ WNDCharawc; strncpy(wc.classname,\"CMainFrame\10);strncpy(wc.wndText,\"MyWindowText\12);EnumWindows(&EnumWindowProc,&wc);} ====================================== 附带:要找所有子窗口,用EnumChildWindows()函数。在MFC程序中,调用这些函数可能需要使用全局命名空间。例如 ::GetWindowText(hwnd,(LPTSTR)buf,128);::GetWindowTextLength(hwnd); ::EnumWindows(&EnumWindowsProc,(long)szAppName)) 怎样得到窗口句柄的问题 2007-12-1015:14 在DLL封装对话框,涉及到怎样得到窗口句柄的问题1、直接得句柄GetActiveWindow(); //得激活窗口句柄 //的前台窗口句柄 //很常规的,涉及到很多方法 GetForegroundWindows(); AfxGetApp()->GetMainWnd()->GetSafeHwnd()2、枚举型的HWNDGetWindow( HWNDhWnd,UINTuCmd); HWNDFindWindowEx(HWNDhwndParent,HWNDhwndChildAfter,LPCTSTRlpszClass,LPCTSTRlpszWindow);确定 3、其他参数的句柄进程ID: //要先有hWnd,然后指明uCmd的关系 //由类名和窗口标题得句柄,可能不只一个,所以不唯一 MARK:由句柄得ID可以用GetWindowThreadProcessId()而由ID的句柄只能枚举+比较了 遍历全部窗体,并取得他们对应的HWND进一步取得对应PID,符合已知PID的就是了,当然可能要判断一下窗体状态了,如果进程只有一个窗体那就不用了。例: 如果要在列表框里显示所有的窗口 BOOLCALLBACKEnumWindowsProc(HWNDhwnd,//handletoparentwindowLPARAMlParam//application-definedvalue){ charlpWinTitle[256]; ::GetWindowText(hwnd,lpWinTitle,256-1);CStringm_strTitle; m_strTitle.Format(\"%s\CListBox*p_l=(CListBox*)lParam;if(!m_strTitle.IsEmpty()){ p_l->AddString(lpWinTitle);} returnTRUE;} 调用EnumWindows(EnumWindowsProc,(LPARAM)GetDlgItem(IDC_LIST1));这段程序MARK在挂的ASSIS的DLL中 (全集)获得窗口句柄获得窗口句柄(全集) this->m_hwnd HWNDGetForegroundWindow(VOID);GetSafehWnd取你程序所在窗口类的句柄GetActiveWindow取当前活动窗口句柄AfxGetMainWnd取主窗口句柄GetForegroundWindow取前台窗口句柄FindWindowEnumWindow 因篇幅问题不能全部显示,请点此查看更多更全内容