回 帖 发 新 帖 刷新版面

主题:难题:如何获得其他软件的界面里面的控件的句柄?

有个比较难的编程问题想请教一下高手.
我在网上找了很久都还没有找到答案.

用什么方法可以获得其他软件的界面里面的控件的句柄呢?
例如,我想用调用API函数的方式,获得QQ登陆界面里面QQ帐号输入框这个控件的句柄,有办法吗?
具体的代码是怎样的呢?用VF可以办到吗?还是得用VC或其他语言.

回复列表 (共7个回复)

沙发

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) 测试通过.

板凳

谢谢楼上,太厉害了.
其实我是想知道思路,我想获取的不是QQ的句柄,而是其他软件界面.

请问一下
"TXGuiFoundation"

"ATL:602E54D8"
这些是怎么来的呢?

3 楼

SPY++ 查看出来的.
这属于前期分析工作.

4 楼

楼上的知识面好广好深,你不是一般的Foxer! 敬佩!

我还没有学会用SPY++,分析内存,自动获取.
而若要用鼠标手动获取,你觉得可能吗?
用什么代码或API函数能实现呢?

5 楼

不知道你要干什么.
看你的意思是点一下就获得窗口句柄(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 楼


非常感谢你!
通过你的线索:SPY++
我终于解决了寻找控件句柄的难题.
真想给你评30分.可惜分满了.

楼上的方式我还得慢慢研究下.
其实我的编程又有了新问题...

7 楼

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,再点其他窗体时能得到一些东西,但是在其他窗口之间切换时,是没反映的.

我来回复

您尚未登录,请登录后再回复。点此登录或注册