怎么获取当前窗体上的全部句柄(60分)

  • 主题发起人 主题发起人 大狗熊
  • 开始时间 开始时间

大狗熊

Unregistered / Unconfirmed
GUEST, unregistred user!
我在写一个软件,类似于密码结巴,但是如果很多TEDIT框的话,只能获取第一个TEDIT框的内容,如果用GetDlgItem的话,要指定ID,没法通用了,所以这里的问题就是如何能够遍历当前窗体的所有句柄
 
GetWindow(hwnd_parent,GW_CHILD)<br>知道爸爸求儿子 很简单的说 for循环不用说了吧
 
FindWindowEx 或 EnumWindows
 
嘿嘿,不太会弄啊<br>GW_CHILD<br>。。。列一个数组,从1到255还是怎么弄
 
对啊 然后看true 或者 false 我第一次把QQ的密码句柄找出来的时候很兴奋 可教我的老师说这些都是很菜的问题不值得高兴
 
QQ密码句柄直接用SPY++抓不到,你说的这种方法我想过,没动手,哈哈,过会就动手试验下<br>另外看了一个人写的东西,不知道大家有啥思路<br><br>窗口句柄的获得 <br>2003-11-3加入 &nbsp;来自www.csdn.net &nbsp;作者lizsss &nbsp;37条评论 &nbsp;点击28484次 <br> &nbsp; &nbsp; &nbsp; 关键字 &nbsp; &nbsp; win32 API窗口句柄 HWND <br> &nbsp;<br>初次写文档,文笔不通畅的地方,以及理解错误之处望各位朋友多多指正!<br><br>这篇文章是关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!可适用于vc、bcb(其他的我没有试,估计可以),本人在bcb环境下试验。<br><br>首先我会罗列出一些获取句柄的win32 api 函数,然后简单说说他们的用途!最后说说我是怎么理解和应用的。见笑了!<br><br>可用的win32 api函数:<br><br>1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName) <br><br> &nbsp; HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName) <br><br>2.HWND WindowFromPoint(POINT& Point)<br><br>3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)<br><br> &nbsp; BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)<br><br> &nbsp; BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)<br><br> &nbsp; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)<br><br>一般用途:<br><br> &nbsp; &nbsp; &nbsp; 对于第一种,大家都很熟悉,是捕捉句柄的常规武器,FindWindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。可是对于一般群众,不一定知道所有的窗口(包括标题栏、按钮等等)的类名啊!棗可以简单举例,请问你知道桌面图标的窗口的类名吗?而对于窗口标题,有可能会出现相同的标题,有两个窗口棗指一个程序的两个进程,这又是个麻烦吧!好了,这个问题先放放,继续下一组。<br><br> &nbsp; &nbsp; &nbsp; 第二组,通过win32定义的POINT结构(typedef struct tagPOINT { &nbsp; LONG x;<br><br> &nbsp;LONG y;} POINT),来获得当前鼠标光标位置的窗口HWND,这是最直观的武器!常规操作如下:先得到Cursor的POINT(BOOL GetCursorPos(LPPOINT)函数),再用WindowFromPoint。这样,我们几乎可以获得任何打开的有窗口的函数的HWND了!然后通过获取类名的win32 api函数(int GetClassName( &nbsp;HWND hWnd, &nbsp; LPTSTR lpClassName, &nbsp; int nMaxCount ))得到类名棗这里的lpClassName最好用字符数组地址,nMaxCount就是数组的size了,同时,这种方法解决了第一个问题的麻烦!棗我可以把鼠标放在任何地方!*^_^*<br><br> &nbsp; &nbsp; &nbsp; 第三组,这些是用来列举和处理任何窗口的超级武器!通过组合运用EnumWindows和EnumWindowsProc,EnumChildWindows与EnumChildProc,可以扫描桌面所有窗口并对之处理!<br><br>我的理解:(这部分用任务驱动式教学方法棗谁让小弟是老师呢!xi xi)<br><br>任务:得到所有的窗口的类名。<br><br>解决办法1:我们会先想到第三组,可以自桌面窗口开始(它是所有窗口的祖先),依次扫描,获取类名并存之。有点儿像Visual Stdio的Spy++,或者Borland 的WinSight32,具体办法如下:(bcb中)<br><br>在主程序中,调用EnumWindows,传入YouEnumProc的函数地址作第一个参数,别忘了转换成WNDENUMPROC类型。第二参可NULL。::EnumWindows(reinterpret_cast YouEnumProc,NULL);<br><br>在YouEnumProc函数中,如果第一参HWND = = NULL,就跳离(return FALSE;),可以结束啦!<br><br>然后,把类名数组准备好,得到类名,存之。<br><br>返回真值,继续下一次扫描。<br><br>看起来并不复杂,是一种函数递归。但是我可会解释!面啊!: p<br><br>第二种解决方法:简单、直观棗自己想出来的,颇得意<br><br>首先准备一个时钟,一种存类名方法(我用TMemo)<br><br>在定时器处理函数中:<br><br>1、得到当前cursor的点位置<br><br>2、再用WindowFromPoint,<br><br>3、然后得到类名,放到TMemo里<br><br>这样可以用鼠标获得你想要的窗口(包括按钮等),只要鼠标在窗口放一会儿。。。哈哈<br><br>第三种方法:其实利用FindWindow和循环结构也应该可以<br><br>总结:其实得到HWND的方法很多,比如知道了窗口层次,依次向下扫。。。在说第三种呢!但我觉得,我的方法最直接有效,你说呢?<br><br>欢迎大家与我联系,并讨论这个问题!有关这个问题我还有许多疑问,比如HWND与ID的转换,在如IE页面中的表单控件的HWND或ID,还是其他的东东,总之是能识别他的东西。。。这个我很困惑,没办法!
 
EnumWindows是获得系统运行的所有窗体。。。和我说的不是一回事情哪<br>findwindowex也要指定啊
 
有些东西就是没有句柄的,怎么抓?
 
EnumWindows &nbsp;<br>好像可以用。。。我刚看到一个源码参考,自己写程序测试下,呵呵,不能太教条了
 
大家好,为什么大富翁的帐号确认功能不能用了,不做确认就没法提问,我是新注册的用户,为此我注册了两个了。能提问的大伙能不能反应一下啊。
 
有遍历的就行.<br>function EnumProc(hwnd:Thandle;lparam:lparam):boolean; Stdcall;<br>var<br> &nbsp; &nbsp;lpText,lpCaption &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:array[0..255] of char;<br><br>begin<br> &nbsp; &nbsp;Result := true;<br> &nbsp; &nbsp;GetClassName(hwnd,@lpText,255);//得到类名。<br> &nbsp; &nbsp;if LowerCase(lpText)=lowercase('tbutton') then<br>//这个用类别来查找。这里举例用TBUTTON<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;Hchild := hwnd;<br> &nbsp; &nbsp; &nbsp; &nbsp;GetWindowText(Hchild,lpCaption,100);<br> &nbsp; &nbsp; &nbsp; &nbsp;if trim(lpCaption)='按钮的CAPTION写在这里' then//在这边用CAPTION来查找<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := false//打到返回FALSE<br> &nbsp; &nbsp; &nbsp; &nbsp;else<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := true;<br> &nbsp; &nbsp;end;<br>end;<br><br>function TForm1.GetEditHandle(WinCap:string):integer;<br>var<br> &nbsp; &nbsp;hParent &nbsp; &nbsp; &nbsp; &nbsp; :Thandle;<br> &nbsp; &nbsp;i &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :integer;<br>begin<br> &nbsp; &nbsp;Result := 0;<br> &nbsp; &nbsp;Hchild := 0;<br> &nbsp; &nbsp;hParent := FindWindow(nil,pchar(''));//窗体的名称写在这边<br> &nbsp; &nbsp;if hParent=0 then Exit;<br> &nbsp; &nbsp;EnumChildWindows(hParent,@EnumProc,0);//回调EnumProc<br> &nbsp; &nbsp;Result := Hchild;<br><br>end;<br>也可用<br>var<br> H1,H2:THandle;<br>begin<br> &nbsp;H1:=FindWindow('TForm1','shenqw');<br> &nbsp;H2:=Findwindowex(H1,0,'TButton','Button1');<br> &nbsp;SendMessage(H2,bm_click,0,0);<br>end;
 
嘿嘿,试验下
 
procedure TForm1.Button1Click(Sender: TObject);<br>var<br>hCurrentWindow:HWnd;<br>szText:array[0..254]of char;<br>Window,Window2: THandle;<br>begin<br> &nbsp; &nbsp;Window:=FindWindow('Afx:400000:0', nil);<br> &nbsp; &nbsp;if window = 0 then exit;<br> &nbsp; &nbsp;window2:=FindWindow('#32770', '登录信息');<br> &nbsp; &nbsp;if window2 = 0 then exit;<br>hCurrentWindow:=GetWindow(window2,GW_CHILD);<br>while &nbsp;hCurrentWindow&lt;&gt;0 &nbsp;do<br>begin<br>if &nbsp;GetWindowText(hCurrentWindow,@szText,255)&gt;0 &nbsp;then<br>Memo1.Lines.Add(StrPas(@szText));<br>hCurrentWindow:=GetWindow(hCurrentWindow,GW_HWNDNEXT);<br>end;<br>获取的全部是标题....联众或者QQ的密码框等一个也获取不到
 
没人帮我看看吗
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3529812 帮忙来解决啊。
 
后退
顶部