各位大虾,如何知道用户点了另一个软件的一个按键呀??
能不能给点提示:)

解决方案 »

  1.   

    用GetForegroundWindow得到那个软件的活动窗口句柄
    sendmessage再将wm_lbuttondown消息通知给你的监视的窗体
      

  2.   

    看了些资料,普通的EXE只能生对自已程序进行HOOK,要对其它程序HOOK,要生成DLL才能实现,VB又无法生成DLL,只有ACTIVE DLL。真不知该怎么办了,望高手指点。一定要转其它语言来实现吗?
      

  3.   

    如果只是一般的消息HOOK,并且在2000及以上系统中使用,你可以试试用WH_MOUSE_LL这个HOOK.它可以实现不用DLL的全局鼠标HOOK.至于API HOOK,我只见过别人实现过,目前我是无法问津的............
      

  4.   

    可以用变通的办法,用
    intMouse = (GetAsyncKeyState(VK_LBUTTON) And &HFF00) / 2 ^ 15
    获取当前鼠标信息(或直接用鼠标钩子,不过要麻烦)用
    Private Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Long
    判断前台窗体是不是你要监控的窗体用
    Private Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long
    获取鼠标座标
      

  5.   

    关于钩子的代码,供参考
    '---------------------------------
    'Form 
    '安装钩子
    Private sub AddHook()
      '鼠标钩子
      lHook(1) = SetWindowsHookEx(WH_MOUSE_LL, AddressOf CallMouseHookProc, App.hInstance, 0)
    End Sub
    '卸钩子
    Private sub DelHook()
      UnhookWindowsHookEx lHook(0)
      UnhookWindowsHookEx lHook(1)
    End Sub
    '---------------------------------
    '模块
    Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
    Public Type KEYMSGS
           vKey As Long          '虚拟码  (and &HFF)
           sKey As Long          '扫描码
           flag As Long          '键按下:128 抬起:0
           time As Long          'Window运行时间
    End Type
    Public Type MOUSEMSGS
           X As Long            'x座标
           Y As Long            'y座标
           a As Long
           b As Long
           time As Long         'Window运行时间
    End Type
    Public Type POINTAPI
        X As Long
        Y As Long
    End Type
    Public Const WH_KEYBOARD_LL = 13
    Public Const WH_MOUSE_LL = 14
    Public Const Alt_Down = &H20
    '-----------------------------------------
    '消息
    Public Const HC_ACTION = 0
    Public Const HC_SYSMODALOFF = 5
    Public Const HC_SYSMODALON = 4
    '键盘消息
    Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101
    Public Const WM_SYSKEYDOWN = &H104
    Public Const WM_SYSKEYUP = &H105
    '鼠标消息
    Public Const WM_MOUSEMOVE = &H200
    Public Const WM_LBUTTONDOWN = &H201
    Public Const WM_LBUTTONUP = &H202
    Public Const WM_LBUTTONDBLCLK = &H203
    Public Const WM_RBUTTONDOWN = &H204
    Public Const WM_RBUTTONUP = &H205
    Public Const WM_RBUTTONDBLCLK = &H206
    Public Const WM_MBUTTONDOWN = &H207
    Public Const WM_MBUTTONUP = &H208
    Public Const WM_MBUTTONDBLCLK = &H209
    Public Const WM_MOUSEACTIVATE = &H21
    Public Const WM_MOUSEFIRST = &H200
    Public Const WM_MOUSELAST = &H209
    Public Const WM_MOUSEWHEEL = &H20A
    Public Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long
    Public strKeyName As String * 255
    Public Declare Function GetActiveWindow Lib "user32" () As Long
    Public keyMsg As KEYMSGS
    Public MouseMsg As MOUSEMSGS
    Public lHook(1) As Long
    '----------------------------------------
    '模拟鼠标
    Private Const MOUSEEVENTF_LEFTDOWN = &H2
    Private Const MOUSEEVENTF_LEFTUP = &H4
    Private Const MOUSEEVENTF_ABSOLUTE = &H8000 '  absolute move
    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
    Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
    '--------------------------------------
    '模拟按键
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    '鼠标钩子    
    Public Function CallMouseHookProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Dim pt As POINTAPI    If code = HC_ACTION Then
          CopyMemory MouseMsg, lParam, LenB(MouseMsg)
          
          Form1.txtMsg(1).Text = "X=" + Str(MouseMsg.X) + " Y=" + Str(MouseMsg.Y)
          Form1.txtHwnd(1) = Format(wParam, "0")
          
          If wParam = WM_MBUTTONDOWN Then                      '把中键改为左键
               mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
               CallMouseHookProc = 1
          End If
          
          If wParam = WM_MBUTTONUP Then
              mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
              CallMouseHookProc = 1
          End If
            
        End If
        
        If code <> 0 Then
          CallMouseHookProc = CallNextHookEx(0, code, wParam, lParam)
        End If
      
    End Function
      

  6.   

    嘿,我有个思路,应该可行的吧!!!条件:   知道目标按钮上的文字内容过程:   一,挂个全局鼠标HOOK,监视鼠标单击事件   二,使用GetCursorPos + WindowFromPoint得到鼠标下控件句柄,进而得到类名与内容;   三,在单击消息里,判断一下当前鼠标下的控件是不是你要监视的那个按钮(通过类名与内容判断);   这下就简单啦!!鼠标单击+类名相同+内容相同,嘿嘿,再不行我请你吃KFC!不过也请大家帮我解决一下菜单的问题!!如下:http://community.csdn.net/Expert/topic/4189/4189871.xml?temp=.9504358这个问题有点难呀,我已经在MS的VB新闻组里发了帖了,不过都还是没有有用的回复!大家也加油!!^^
      

  7.   


      谢谢小马和各位大侠的思路,鼠标HOOK已经出来了,原来我是用屏幕坐标来检测,那个按钮是否被点击,鼠标单击+当前为监控窗体+坐标相同=执行监控程序
    但是如果用户改变了,监控窗体的大小这时候那个按钮在屏幕上的坐标,也就变了,我只能屏蔽
    监控窗体的最大化等按钮,用小马的方法应该可以完全实现我预期的功能,谢谢。
      程序写完时我再把这部分源码贴出来,希望大家指点。
      

  8.   

    恭喜呀~~~~HEHE同时也请大家研究一下我那个问题~~~:D