初次写文档,文笔不通畅的地方,以及理解错误之处望各位朋友多多指正! 这篇文章是关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!可适用于vc、bcb(其他的我没有试,估计可以),本人在bcb环境下试验。 首先我会罗列出一些获取句柄的win32 api 函数,然后简单说说他们的用途!最后说说我是怎么理解和应用的。见笑了! 可用的win32 api函数: 1.hwnd findwindow(lpctstr lpclassname, lpctstr lpwindowname) hwnd findwindowex(hwnd hwndparent, hwnd hwndchildafter,lpctstr lpclassname, lpctstr lpwindowname) 2.hwnd windowfrompoint(point& point) 3.bool callback enumchildproc(hwnd hwnd,lparam lparam) bool callback enumchildwindows(hwnd hwndparent, wndenumproc lpenumfunc,lparam lparam) bool callback enumwindows(wndenumproc lpenumfunc, lparam lparam) bool callback enumwindowsproc(hwnd hwnd, lparam lparam) 一般用途: 对于第一种,大家都很熟悉,是捕捉句柄的常规武器,findwindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个hwnd。可是对于一般群众,不一定知道所有的窗口(包括标题栏、按钮等等)的类名啊!——可以简单举例,请问你知道桌面图标的窗口的类名吗?而对于窗口标题,有可能会出现相同的标题,有两个窗口——指一个程序的两个进程,这又是个麻烦吧!好了,这个问题先放放,继续下一组。 第二组,通过win32定义的point结构(typedef struct tagpoint { long x; 第三组,这些是用来列举和处理任何窗口的超级武器!通过组合运用enumwindows和enumwindowsproc,enumchildwindows与enumchildproc,可以扫描桌面所有窗口并对之处理! 我的理解:(这部分用任务驱动式教学方法——谁让小弟是老师呢!xi xi) 任务:得到所有的窗口的类名。 解决办法1:我们会先想到第三组,可以自桌面窗口开始(它是所有窗口的祖先),依次扫描,获取类名并存之。有点儿像visual stdio的spy++,或者borland 的winsight32,具体办法如下:(bcb中) 在主程序中,调用enumwindows,传入youenumproc的函数地址作第一个参数,别忘了转换成wndenumproc类型。第二参可null。::enumwindows(reinterpret_cast<wndenumproc> youenumproc,null); 在youenumproc函数中,如果第一参hwnd = = null,就跳离(return false;),可以结束啦! 然后,把类名数组准备好,得到类名,存之。 返回真值,继续下一次扫描。 看起来并不复杂,是一种函数递归。但是我可会解释!面啊!: p 第二种解决方法:简单、直观——自己想出来的,颇得意 首先准备一个时钟,一种存类名方法(我用tmemo) 在定时器处理函数中: 1、得到当前cursor的点位置 2、再用windowfrompoint, 3、然后得到类名,放到tmemo里 这样可以用鼠标获得你想要的窗口(包括按钮等),只要鼠标在窗口放一会儿。。。哈哈 第三种方法:其实利用findwindow和循环结构也应该可以 总结:其实得到hwnd的方法很多,比如知道了窗口层次,依次向下扫。。。在说第三种呢!但我觉得,我的方法最直接有效,你说呢? 欢迎大家与我联系,并讨论这个问题!有关这个问题我还有许多疑问,比如hwnd与id的转换,在如ie页面中的表单控件的hwnd或id,还是其他的东东,总之是能识别他的东西。。。这个我很困惑,没办法! 不清楚地方,大家要参照msdn啊!(好东西呀!)
long y;} point),来获得当前鼠标光标位置的窗口hwnd,这是最直观的武器!常规操作如下:先得到cursor的point(bool getcursorpos(lppoint)函数),再用windowfrompoint。这样,我们几乎可以获得任何打开的有窗口的函数的hwnd了!然后通过获取类名的win32 api函数(int getclassname( hwnd hwnd, lptstr lpclassname, int nmaxcount ))得到类名——这里的lpclassname最好用字符数组地址,nmaxcount就是数组的size了,同时,这种方法解决了第一个问题的麻烦!——我可以把鼠标放在任何地方!*^_^*