大神们,本人新手一枚,最近想用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
#########################################################################################大神们请帮忙看看有没有其他方法可以实现,万分感谢!

解决方案 »

  1.   

    消息HOOK不能“跨进程”,可能只有“DLL远程注入”了吧。
    用Timer控件,不能“及时”反应,很可能是获取不到消息的。
      

  2.   

    WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/
      

  3.   

    问题已经解决,谢谢大家帮忙!分享一下经验:
    先抓到需要监控按钮句柄,用findwindowex(可配合spy++查找句柄),然后用getwindowrect获取句柄坐标,再用hook监控点击事件。
      

  4.   

    方法不错,全局鼠标消息HOOK是可行的。不过你这还得同时检测一下“控件所在的窗口”是否是前台窗口吧!
    要不然,它被别的窗口挡住时、在别的窗口中但又是在那个控件区域点了鼠标,你也认为“点击了”?
    还有一个,“控件所在窗口”是可以拖动位置的,这样还需要每次获取“控件矩形”才行呢。
      

  5.   

    是存在这样的问题
    “不过你这还得同时检测一下“控件所在的窗口”是否是前台窗口吧!”这个用什么方法可以实现?矩阵问题我是用timer不断更新矩阵位置的,感觉方法有点笨,有没有其他方法?
      

  6.   

    你“找按钮控件”,总要先找到“控件所在的窗口”吧!
    保留这个窗口的句柄值,在监测到“鼠标点击”消息时,
    用API函数GetForegroundWindow()获取一下前台窗口的句柄,看跟“被监视窗口”是否一致。
    (你不至于用Spy++直接查看按钮的句柄,给你的“程序”用吧? 就算你这样搞,也可以把窗口句给程序用啊)
    窗口句柄相同时,再看“点击位置”是否在那个按钮上。
    (ps : 其实你不应该用timer不断更新“按钮矩形”,应该就是在这儿获取按钮矩形区、再检查点击位置是否在这个区域内)
      

  7.   

    表格? 如果是“表格控件”,好像各种表格控件都不行的。
    印象中只有ListView控件,可以通过句柄、消息获取内容。你首先要确定的是你说的这个“表格”究竟是什么控件。
      

  8.   

    参考下面代码,把句柄换成外部按钮的看看。’-------------------------------------窗口代码
    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
      

  9.   

    你不知道 SetWindowLong( ) 不能实现“跨进程HOOK”啊?