主题:难题:如何获得其他软件的界面里面的控件的句柄?
火速技术
[专家分:700] 发布于 2009-05-25 22:41:00
有个比较难的编程问题想请教一下高手.
我在网上找了很久都还没有找到答案.
用什么方法可以获得其他软件的界面里面的控件的句柄呢?
例如,我想用调用API函数的方式,获得QQ登陆界面里面QQ帐号输入框这个控件的句柄,有办法吗?
具体的代码是怎样的呢?用VF可以办到吗?还是得用VC或其他语言.
回复列表 (共7个回复)
沙发
Vii [专家分:1130] 发布于 2009-05-26 00:32:00
DECLARE Integer FindWindow IN User32.dll String lpClassName,String lpWindowName
Declare Integer FindWindowEx in user32 integer, integer, String,String
mhwnd=findwindow("TXGuiFoundation","QQ2009 正式版")
?mhwnd
chwnd1=FindWindowEx(mhwnd,0,"ATL:602E54D8","")
?chwnd1
chwnd2=FindWindowEx(mhwnd,0,"Edit","T")
?chwnd2
Windows Server 2008 Standard
SPY++ 5.00.7010
VFP9.0-2412
QQ2009 正式版(660) 测试通过.
板凳
火速技术 [专家分:700] 发布于 2009-05-26 10:17:00
谢谢楼上,太厉害了.
其实我是想知道思路,我想获取的不是QQ的句柄,而是其他软件界面.
请问一下
"TXGuiFoundation"
"ATL:602E54D8"
这些是怎么来的呢?
3 楼
Vii [专家分:1130] 发布于 2009-05-26 12:30:00
SPY++ 查看出来的.
这属于前期分析工作.
4 楼
火速技术 [专家分:700] 发布于 2009-05-26 15:45:00
楼上的知识面好广好深,你不是一般的Foxer! 敬佩!
我还没有学会用SPY++,分析内存,自动获取.
而若要用鼠标手动获取,你觉得可能吗?
用什么代码或API函数能实现呢?
5 楼
Vii [专家分:1130] 发布于 2009-05-26 21:27:00
不知道你要干什么.
看你的意思是点一下就获得窗口句柄(SPY++有的功能了啊.)
试了试:
=BINDEVENT(THISFORM.HWnd,WM_NCLBUTTONDOWN,THISFORM,"MyMethod")
结果失败.
换了个路子,用时钟控件来返回最后按键.
Form init():
_screen.visible=.F.
DECLARE INTEGER GetAsyncKeyState IN user32 INTEGER vKey
DECLARE integer GetForegroundWindow in Win32API
DECLARE integer GetWindowText in Win32API integer HWND, string @ BuffForTitle, integer LenOfBuff
Timer1 Timer():--检测时间为50ms
if GetAsyncKeyState(1)=-32767
m.lnHWND=getForegroundWindow()
?'鼠标左键',m.lnHWND
return
endif
if GetAsyncKeyState(2)=-32767
m.lnHWND=getForegroundWindow()
?'鼠标右键',m.lnHWND
return
endif
----根据句柄返回窗口标题
*lcTitleOfWindow=space(100)
*GetWindowText(m.lnHWND,@lcTitleOfWindow,len(lcTitleOfWindow))
*?lcTitleOfWindow
6 楼
火速技术 [专家分:700] 发布于 2009-05-28 10:37:00
非常感谢你!
通过你的线索:SPY++
我终于解决了寻找控件句柄的难题.
真想给你评30分.可惜分满了.
楼上的方式我还得慢慢研究下.
其实我的编程又有了新问题...
7 楼
Vii [专家分:1130] 发布于 2009-05-28 21:59:00
Form1建立一个新方法:MyMethod(),
Form1 init():
_screen.visible=.F.
DECLARE INTEGER GetForegroundWindow IN user32
DECLARE integer GetWindowText in Win32API integer HWND, string @ BuffForTitle, integer LenOfBuff
DECLARE integer GetForegroundWindow in Win32API
=BINDEVENT(this.HWnd,WM_ACTIVATE,THISFORM,"MyMethod")
Form1 MyMethod():
lparameters hWnd,Msg,wParam,lParam
DO case
case Msg =0x06 &&WM_ACTIVATE
do case
case wParam = 0 &&WA_INACTIVE
?'句柄:',GetForegroundWindow()
*m.lnHWND=GetForegroundWindow()
*lcTitleOfWindow=space(100)
*GetWindowText(m.lnHWND,@lcTitleOfWindow,len(lcTitleOfWindow))
*?ALLTRIM(lcTitleOfWindow)
case wParam =1 &&WA_ACTIVE 标题栏
?'标题栏激活本窗口'
case wParam =2 &&WA_CLICKACTIVE 客户区
?'本窗口被鼠标激活'
endcase
ENDCASE
这样在点一下vfp Form1,再点其他窗体时能得到一些东西,但是在其他窗口之间切换时,是没反映的.
我来回复