如何获取外部程序窗口按钮被点击事件【已解决】
本帖最后由 cfs43210 于 2012-3-19 19:26 编辑外部程序窗口有一个按钮Button1,如果被鼠标点击了,AU3脚本执行下一步。因为外部程序按钮Button1点击了弹出窗口不是固定的,所以没办法用获取窗口标题判断。要代码例子,我是一个新手。
希望高手帮忙,万份感谢! 期待高手出现~~~ 本帖最后由 pusofalse 于 2012-2-29 03:15 编辑
#include <MsgSpy.au3>
#include <WinAPI.au3>
Const $WM_COMMAND = 0x111
Const $BUTTON_ID = 1
_SPY_InitLibrary()
_SPY_ListenPort($SPY_OBJECT_WINDOW)
Send("#r")
Local $hWnd = WinWait("运行")
Local $hMsgHandler = DllCallBackRegister("_SpyMsgHandler", "none", "ptr;long;ptr;hwnd;long;long;lparam;lresult")
Local $pMsgHandler = DllCallBackGetPtr($hMsgHandler)
Local $aMsgFilter = [$WM_COMMAND]
Local $pMsgFilter = _SPY_CreateMsgFilter($aMsgFilter, $SPY_MSG_OK)
Local $tContext = DllStructCreate("long ButtonID;bool End")
Local $pContext = DllStructGetPtr($tContext)
DllStructSetData($tContext, "ButtonID", $BUTTON_ID)
DllStructSetData($tContext, "End", 0)
Local $pObject = _SPY_CreateObject($hWnd, $pMsgHandler, $pMsgFilter, $pContext)
_SPY_CreateChannel($pObject)
_SPY_SignalObject($pObject)
While DllStructGetData($tContext, "End") = 0 And WinExists($hWnd)
Sleep(100)
WEnd
_SPY_UnsignalObject($pObject)
_SPY_CloseChannel($pObject)
_SPY_CloseObject($pObject)
DllCallBackFree($hMsgHandler)
Func _SpyMsgHandler($pObject, $iObjectType, $pContext, $hWnd, $iMsg, $iwParam, $ilParam, $iResult)
If ($iMsg = $WM_COMMAND) Then
Local $tContext = DllStructCreate("long ButtonID;bool End", $pContext)
If DllStructGetData($tContext, "ButtonID") == $iwParam Then
MsgBox(0, "OK", "You clicked the button.")
DllStructSetData($tContext, "End", 1)
EndIf
EndIf
EndFunc ;==>_SpyMsgHandler
在“运行”对话框里点“确定”,会截取到点击消息。 这代码少了个#include <MsgSpy.au3>运行不了 期待好心人发一个#include <MsgSpy.au3>,让我测试。感谢版主pusofalse,代码看不懂。我的外部程序有好几层窗口,我要获取的不是主窗口按钮事件,而是子要获取子窗口按钮事件。不知道上面代码是不是这样的谢谢版主。 MsgSpy.au3,在本论坛搜索即可找到。
常量$BUTTON_ID设为你的外部程序中Button1的ID。另外Local $hWnd = WinWait("运行"),这里改成Button1父窗口的标题。
截取按钮点击事件,既可以截取父窗口的WM_COMMAND消息,也可以直接截取按钮控件的WM_LBUTTONUP或WM_KEYUP消息。按钮控件的消息过程收到WM_LBUTTONUP/WM_KEYUP之后,会判断自身之前是否接收到WM_LBUTTONDOWN/WM_KEYDOWN,如果有,则发送WM_COMMAND给父窗口。 版主是不是我这又少了什么东西啊?D:\autoit3\Include\SpyKernel.au3(2,10) : 错误: 不能打开包含文件 <Thread.au3>.
#include <Thread.au3>
~~~~~~~~~^
D:\autoit3\Include\SpyInterface.au3(19,61) : 错误: _RTGetModuleHandle(): 未定义的函数.
DllStructSetData($tBuffer, "Instance", _RTGetModuleHandle(0)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\autoit3\Include\SpyInterface.au3(32,55) : 错误: _RTWriteBytes(): 未定义的函数.
_RTWriteBytes(_SPY_DefaultHandler() + 60, $iResult)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\autoit3\Include\SpyInterface.au3(42,28) : 错误: _RTHeapAlloc(): 未定义的函数.
$pBuffer = _RTHeapAlloc(64)
~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\autoit3\Include\SpyInterface.au3(50,52) : 错误: _RTCreateThread(): 未定义的函数.
$hThread = _RTCreateThread($pBuffer + 20, $pBuffer)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\autoit3\Include\SpyInterface.au3(51,27) : 错误: _RTWaitForObject(): 未定义的函数.
_RTWaitForObject($hThread)
~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\autoit3\Include\SpyInterface.au3(54,46) : 错误: _RTHeapFree(): 未定义的函数.
If ($iExit = 0) Then _RTHeapFree($pBuffer)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\autoit3\Include\SpyInterface.au3(56,44) : 错误: _RTCloseHandle(): 未定义的函数.
Return SetError(0, _RTCloseHandle($hThread)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\autoit3\Include\SpyInterface.au3(140,36) : 错误: _RTVirtualAlloc(): 未定义的函数.
$pStartAddr = _RTVirtualAlloc(1024)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\autoit3\Include\SpyInterface.au3(176,91) : 错误: _RTGetProcAddress(): 未定义的函数.
DllStructSetData($tBuffer, "SendMessageW", _RTGetProcAddress("User32.dll", "SendMessageW")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\Program Files\Hotel\99999.au3 - 10 错误, 0 警告 版主不好意思又要麻烦,这代码在一个按钮有ID就正常,哎我现在获取窗口一个ID里内好几个按钮。现在怎么搞。谢谢你看用什么办法。 超级版主在线吗?帮忙99我,谢谢!
RE: 如何获取外部程序窗口按钮被点击事件(问题解决)
谢谢!版主pusofalse 回复 3# pusofalseP大就是厉害,代码看不懂啊! pusofalse大哥你好!我是上次发贴《如何获取外部程序窗口按钮被点击事件》现在问题是我这边按钮是没有ID号,不知道是什么原因。好几个按扭放在ThunderRT6PictureBoxDC这样一个控件下,这个控件有ID号,但是理面的按钮没有ID号,其它信息都有,为独没有ID号。有没其它办法做到。这个对我太重要。谢谢你能给我一个回复。 没按钮外部程序 自动运行怎么样
页:
[1]