找回密码
 加入
搜索
查看: 6453|回复: 12

[GUI管理] 如何获取外部程序窗口按钮被点击事件【已解决】

  [复制链接]
发表于 2012-2-29 00:28:35 | 显示全部楼层 |阅读模式
本帖最后由 cfs43210 于 2012-3-19 19:26 编辑

外部程序窗口有一个按钮Button1,如果被鼠标点击了,AU3脚本执行下一步。因为外部程序按钮Button1点击了弹出窗口不是固定的,所以没办法用获取窗口标题判断。要代码例子,我是一个新手。
希望高手帮忙,万份感谢!
 楼主| 发表于 2012-2-29 01:48:06 | 显示全部楼层
期待高手出现~~~
发表于 2012-2-29 03:04:52 | 显示全部楼层
本帖最后由 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[1] = [$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


在“运行”对话框里点“确定”,会截取到点击消息。

评分

参与人数 2贡献 +13 收起 理由
lixiaolong + 8 pusofalse版主的代码看不懂...
afan + 5 厉害

查看全部评分

发表于 2012-2-29 09:40:53 | 显示全部楼层
这代码少了个#include <MsgSpy.au3>运行不了
 楼主| 发表于 2012-2-29 13:25:27 | 显示全部楼层
期待好心人发一个#include <MsgSpy.au3>,让我测试。感谢版主pusofalse,代码看不懂。我的外部程序有好几层窗口,我要获取的不是主窗口按钮事件,而是子要获取子窗口按钮事件。不知道上面代码是不是这样的谢谢版主。
发表于 2012-2-29 13:55:31 | 显示全部楼层
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给父窗口。
 楼主| 发表于 2012-2-29 15:37:36 | 显示全部楼层
版主是不是我这又少了什么东西啊?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[0])
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
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[2] = 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 警告
 楼主| 发表于 2012-2-29 16:16:07 | 显示全部楼层
版主不好意思又要麻烦,这代码在一个按钮有ID就正常,哎我现在获取窗口一个ID里内好几个按钮。现在怎么搞。谢谢你看用什么办法。[img][/img]
 楼主| 发表于 2012-2-29 16:38:43 | 显示全部楼层
超级版主在线吗?帮忙99我,谢谢!
 楼主| 发表于 2012-2-29 19:05:30 | 显示全部楼层

RE: 如何获取外部程序窗口按钮被点击事件(问题解决)

谢谢!版主pusofalse
发表于 2012-2-29 19:51:41 | 显示全部楼层
回复 3# pusofalse
P大就是厉害,代码看不懂啊!
 楼主| 发表于 2012-3-3 09:59:11 | 显示全部楼层
pusofalse大哥你好!我是上次发贴《如何获取外部程序窗口按钮被点击事件》现在问题是我这边按钮是没有ID号,不知道是什么原因。好几个按扭放在ThunderRT6PictureBoxDC这样一个控件下,这个控件有ID号,但是理面的按钮没有ID号,其它信息都有,为独没有ID号。有没其它办法做到。这个对我太重要。谢谢你能给我一个回复。
发表于 2012-6-5 22:20:42 | 显示全部楼层
没按钮外部程序 自动运行怎么样
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-30 09:33 , Processed in 0.085946 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表