VB 已知按钮句柄,如何监控按钮有没有被点击?

admini2016 2016-11-09 07:51:39
大神们,本人新手一枚,最近想用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
#########################################################################################

大神们请帮忙看看有没有其他方法可以实现,万分感谢!
...全文
6830 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
无·法 2016-11-12
  • 打赏
  • 举报
回复
参考下面代码,把句柄换成外部按钮的看看。
’-------------------------------------窗口代码
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
舉杯邀明月 2016-11-12
  • 打赏
  • 举报
回复
表格?  如果是“表格控件”,好像各种表格控件都不行的。 印象中只有ListView控件,可以通过句柄、消息获取内容。 你首先要确定的是你说的这个“表格”究竟是什么控件。
admini2016 2016-11-12
  • 打赏
  • 举报
回复
谢谢,监控按钮基本已经实现了,再请教个事,有方法将某个句柄(表格)中的某个单元格的文本信息取出来吗?
无·法 2016-11-12
  • 打赏
  • 举报
回复
不知道,这样的需求从来没碰到过。。
舉杯邀明月 2016-11-12
  • 打赏
  • 举报
回复
引用 11 楼 sysdzw 的回复:
参考下面代码,把句柄换成外部按钮的看看。
’-------------------------------------窗口代码
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
你不知道 SetWindowLong( ) 不能实现“跨进程HOOK”啊?
admini2016 2016-11-11
  • 打赏
  • 举报
回复
是存在这样的问题


“不过你这还得同时检测一下“控件所在的窗口”是否是前台窗口吧!”

这个用什么方法可以实现?

矩阵问题我是用timer不断更新矩阵位置的,感觉方法有点笨,有没有其他方法?
舉杯邀明月 2016-11-11
  • 打赏
  • 举报
回复
引用 7 楼 admini2016 的回复:
是存在这样的问题 “不过你这还得同时检测一下“控件所在的窗口”是否是前台窗口吧!” 这个用什么方法可以实现? 矩阵问题我是用timer不断更新矩阵位置的,感觉方法有点笨,有没有其他方法?
你“找按钮控件”,总要先找到“控件所在的窗口”吧! 保留这个窗口的句柄值,在监测到“鼠标点击”消息时, 用API函数GetForegroundWindow()获取一下前台窗口的句柄,看跟“被监视窗口”是否一致。 (你不至于用Spy++直接查看按钮的句柄,给你的“程序”用吧? 就算你这样搞,也可以把窗口句给程序用啊) 窗口句柄相同时,再看“点击位置”是否在那个按钮上。 (ps : 其实你不应该用timer不断更新“按钮矩形”,应该就是在这儿获取按钮矩形区、再检查点击位置是否在这个区域内)
赵4老师 2016-11-10
  • 打赏
  • 举报
回复
admini2016 2016-11-10
  • 打赏
  • 举报
回复
感谢你的回复,第一次写,有相关的实例参考吗?
舉杯邀明月 2016-11-10
  • 打赏
  • 举报
回复
引用 5 楼 admini2016 的回复:
问题已经解决,谢谢大家帮忙!分享一下经验: 先抓到需要监控按钮句柄,用findwindowex(可配合spy++查找句柄),然后用getwindowrect获取句柄坐标,再用hook监控点击事件。
方法不错,全局鼠标消息HOOK是可行的。 不过你这还得同时检测一下“控件所在的窗口”是否是前台窗口吧! 要不然,它被别的窗口挡住时、在别的窗口中但又是在那个控件区域点了鼠标,你也认为“点击了”? 还有一个,“控件所在窗口”是可以拖动位置的,这样还需要每次获取“控件矩形”才行呢。
admini2016 2016-11-10
  • 打赏
  • 举报
回复
问题已经解决,谢谢大家帮忙!分享一下经验:
先抓到需要监控按钮句柄,用findwindowex(可配合spy++查找句柄),然后用getwindowrect获取句柄坐标,再用hook监控点击事件。
舉杯邀明月 2016-11-09
  • 打赏
  • 举报
回复
消息HOOK不能“跨进程”,可能只有“DLL远程注入”了吧。 用Timer控件,不能“及时”反应,很可能是获取不到消息的。
admini2016 2016-11-09
  • 打赏
  • 举报
回复
自己顶一下,大神们拜托帮帮忙!

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧