大神们,本人新手一枚,最近想用VB6.0做了一个程序监控第三方程序某个按钮是否被点击。
目前该按钮句柄已经获取,但是监控按钮的点击事件无法实现。
已经验证过的方法:SendMessage 函数未实现更能,使用方法如下(部分第三方程序可以监控到点击事件):
#########################################################################################
一个timer,一个command,一个text。
VB codePrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const BM_GETSTATE = &HF2
Private Sub Form_Load()
Timer1.Interval = 50
Timer1.Enabled = True
End Sub Private Sub Timer1_Timer()
Dim a As Long
a = SendMessage(Command1.hwnd, BM_GETSTATE, 0, 0)
Text1.Text = a
If a = 108 Then MsgBox "按钮被按下了"
End Sub
#########################################################################################大神们请帮忙看看有没有其他方法可以实现,万分感谢!
目前该按钮句柄已经获取,但是监控按钮的点击事件无法实现。
已经验证过的方法:SendMessage 函数未实现更能,使用方法如下(部分第三方程序可以监控到点击事件):
#########################################################################################
一个timer,一个command,一个text。
VB codePrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const BM_GETSTATE = &HF2
Private Sub Form_Load()
Timer1.Interval = 50
Timer1.Enabled = True
End Sub Private Sub Timer1_Timer()
Dim a As Long
a = SendMessage(Command1.hwnd, BM_GETSTATE, 0, 0)
Text1.Text = a
If a = 108 Then MsgBox "按钮被按下了"
End Sub
#########################################################################################大神们请帮忙看看有没有其他方法可以实现,万分感谢!
用Timer控件,不能“及时”反应,很可能是获取不到消息的。
先抓到需要监控按钮句柄,用findwindowex(可配合spy++查找句柄),然后用getwindowrect获取句柄坐标,再用hook监控点击事件。
要不然,它被别的窗口挡住时、在别的窗口中但又是在那个控件区域点了鼠标,你也认为“点击了”?
还有一个,“控件所在窗口”是可以拖动位置的,这样还需要每次获取“控件矩形”才行呢。
“不过你这还得同时检测一下“控件所在的窗口”是否是前台窗口吧!”这个用什么方法可以实现?矩阵问题我是用timer不断更新矩阵位置的,感觉方法有点笨,有没有其他方法?
保留这个窗口的句柄值,在监测到“鼠标点击”消息时,
用API函数GetForegroundWindow()获取一下前台窗口的句柄,看跟“被监视窗口”是否一致。
(你不至于用Spy++直接查看按钮的句柄,给你的“程序”用吧? 就算你这样搞,也可以把窗口句给程序用啊)
窗口句柄相同时,再看“点击位置”是否在那个按钮上。
(ps : 其实你不应该用timer不断更新“按钮矩形”,应该就是在这儿获取按钮矩形区、再检查点击位置是否在这个区域内)
印象中只有ListView控件,可以通过句柄、消息获取内容。你首先要确定的是你说的这个“表格”究竟是什么控件。
Private Sub Command1_Click()
MsgBox 1
End Sub
Private Sub Form_Load()
OldPrc = SetWindowLong(Command1.hwnd, -4, AddressOf CommandProc)
End Sub‘-------------------------------------模块代码
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public OldPrc As Long
Public Function CommandProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Debug.Print Hex(Msg)
If Msg = &H201 Or Msg = &H100 Then Exit Function
CommandProc = CallWindowProc(OldPrc, hwnd, Msg, wParam, lParam)
End Function代码未测试,引用自:https://zhidao.baidu.com/question/522714025.html