alt+shift+Numlock(小键盘灯)
'三个按钮'纪录键盘 鼠标 并回放Option ExplicitPrivate Sub Command1_Click()
    EventLog = 0
    hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf HookProc, _
            App.hInstance, 0)
    Command2.Enabled = True
    Command1.Enabled = False
End SubPrivate Sub Command2_Click()
    UnhookWindowsHookEx hHook
    hHook = 0    Command1.Enabled = True
    Command2.Enabled = False
    Command3.Enabled = True
End SubPrivate Sub Command3_Click()
    PlayLog = 0
    hPlay = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf PlaybackProc, _
            App.hInstance, 0)
    Command3.Enabled = False
End SubPrivate Sub Form_Load()
    Command1.Caption = "纪录"
    Command2.Caption = "停止"
    Command3.Caption = "回放"
    Command2.Enabled = False
    Command3.Enabled = False
End Sub模块Option ExplicitPublic Type EVENTMSG
        message As Long
        paramL As Long
        paramH As Long
        time As Long
        hwnd As Long
End TypePublic Declare Function CallNextHookEx Lib "user32" _
        (ByVal hHook As Long, _
        ByVal ncode As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long
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 Sub CopyMemoryT2H Lib "kernel32" _
        Alias "RtlMoveMemory" _
        (ByVal Dest As Long, _
        Source As EVENTMSG, _
        ByVal Length As Long)
Public Declare Sub CopyMemoryH2T Lib "kernel32" _
        Alias "RtlMoveMemory" _
        (Dest As EVENTMSG, _
        ByVal Source As Long, _
        ByVal Length As Long)
Public Declare Function UnhookWindowsHookEx Lib "user32" _
        (ByVal hHook As Long) As LongPublic Const WH_JOURNALPLAYBACK = 1
Public Const WH_JOURNALRECORD = 0
Public Const HC_SYSMODALOFF = 5
Public Const HC_SYSMODALON = 4
Public Const HC_SKIP = 2
Public Const HC_GETNEXT = 1
Public Const HC_ACTION = 0Public EventArr(1000) As EVENTMSG
Public EventLog As Long
Public PlayLog As Long
Public hHook As Long
Public hPlay As Long
Public recOK As Long
Public canPlay As Long
Public bDelay As BooleanPublic Function HookProc(ByVal iCode As Long, ByVal wParam As Long, _
        ByVal lParam As Long) As Long
    Dim Result As Long
    
    recOK = 1
    Result = 0    If iCode < 0 Then   'iCode小于0必须直接调用下一个消息钩子函数
        Result = CallNextHookEx(hHook, iCode, wParam, lParam)
    ElseIf iCode = HC_SYSMODALON Then   '不允许纪录
        recOK = 0
    ElseIf iCode = HC_SYSMODALOFF Then  '允许纪录
        recOK = 1
    ElseIf ((recOK > 0) And (iCode = HC_ACTION)) Then
        '将消息纪录在纪录队列中
        CopyMemoryH2T EventArr(EventLog), lParam, Len(EventArr(EventLog))
        EventLog = EventLog + 1
        If EventLog >= 1000 Then
            '当纪录大于1000后释放消息钩子
            UnhookWindowsHookEx hHook
        End If
    End If
    HookProc = Result
End FunctionPublic Function PlaybackProc(ByVal iCode As Long, ByVal wParam As Long, _
        ByVal lParam As Long) As Long
    Dim Result As Long
    
    canPlay = 1
    Result = 0    If iCode < 0 Then   'iCode小于0必须直接调用下一个消息钩子函数
        Result = CallNextHookEx(hPlay, iCode, wParam, lParam)
    ElseIf iCode = HC_SYSMODALON Then   '不允许回放
        canPlay = 0
    ElseIf iCode = HC_SYSMODALOFF Then  '允许回放
        canPlay = 1
    ElseIf ((canPlay = 1) And (iCode = HC_GETNEXT)) Then
        If bDelay Then
            bDelay = False
            Result = 50
        End If
        '从纪录队列中取出消息并赋予lParam指针指向的EVENTMSG区域
        CopyMemoryT2H lParam, EventArr(PlayLog), Len(EventArr(EventLog))
    ElseIf ((canPlay = 1) And (iCode = HC_SKIP)) Then
        bDelay = True
        PlayLog = PlayLog + 1
    End If
    
    If PlayLog >= EventLog Then
        UnhookWindowsHookEx hPlay
    End If
    PlaybackProc = Result
End Function

解决方案 »

  1.   

    '===================================
    '在模块中:
    '===================================
    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
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
    Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Public 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)Public Type POINTAPI
            X As Long
            Y As Long
    End TypePublic Const MOUSEEVENTF_MOVE = &H1        '移动鼠标
    Public Const MOUSEEVENTF_LEFTDOWN = &H2    '模拟鼠标左键按下
    Public Const MOUSEEVENTF_LEFTUP = &H4      '模拟鼠标左键抬起
    Public Const MOUSEEVENTF_RIGHTDOWN = &H8   '模拟鼠标右键按下
    Public Const MOUSEEVENTF_RIGHTUP = &H10    '模拟鼠标右键抬起
    Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '模拟鼠标中键按下
    Public Const MOUSEEVENTF_MIDDLEUP = &H40   '模拟鼠标中键抬起
    Public Const MOUSEEVENTF_ABSOLUTE = &H8000 '标示是否采用绝对坐标Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101
    Public Const HC_ACTION = 0
    Public Const WH_JOURNALRECORD = 0Public Const VK_LEFT = &H25
    Public Const VK_RIGHT = &H27
    Public Const VK_UP = &H26
    Public Const VK_DOWN = &H28Type EVENTMSG
            Message As Long
            ParamL As Long
            ParamH As Long
            Time As Long
            hWnd As Long
    End TypePublic hHook As Long
    Public Msg As EVENTMSG
    Sub EnableHook()
       hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf HookProc, App.hInstance, 0)
    End Sub
    Sub FreeHook()
        Dim ret As Long
        ret = UnhookWindowsHookEx(hHook)
    End Sub
    Function HookProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Dim i As Long, j As Integer
        Dim Pt As POINTAPI
        
        Call GetCursorPos(Pt)
        
        If code <> HC_ACTION Then
            HookProc = CallNextHookEx(hHook, code, wParam, lParam)
            Exit Function
        End If
        
        CopyMemory Msg, lParam, LenB(Msg)
        
        If Msg.Message = WM_KEYDOWN Then
            Select Case Msg.ParamL
                Case 18470
                    'Debug.Print "Up"
                    SetCursorPos Pt.X, Pt.Y - 2
                Case 20520
                    'Debug.Print "Down"
                    SetCursorPos Pt.X, Pt.Y + 2
                Case 19237
                    'Debug.Print "Left"
                    SetCursorPos Pt.X - 2, Pt.Y
                Case 19751
                    'Debug.Print "Right"
                    SetCursorPos Pt.X + 2, Pt.Y
                Case 7181
                    'Debug.Print "Return"
                    If GetAsyncKeyState(vbKeyShift) <> 0 Then 'Shift + Return
                        Call mouse_event(MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) '单击左键
                    ElseIf GetAsyncKeyState(vbKeyControl) <> 0 Then 'Ctrl + Return
                        Call mouse_event(MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)  '单击右键
                    End If
                Case Else
                    'Debug.Print Msg.ParamL
            End Select
        End If
        HookProc = CallNextHookEx(hHook, code, wParam, lParam)
    End Function
    '===================================
    '在窗体中:
    '===================================
    Private Sub Form_Load()
        Call EnableHook
    End SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If Button = 1 Then
            MsgBox "Left"
        Else
            MsgBox "Right"
        End If
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Call FreeHook
    End Sub
      

  2.   

    这还用编程吗!
    在WINDOWS操作系统中有一个辅助选项。里面就有一个虚拟鼠标。是用小键盘来控制的。。设置一个就可以了。
    首先看你的操作系统中(在控制面板中)是否安装了“辅助选项”,只要你在安装操作系统时选择的是典型安装(限WIN9X,WINME)都会有的。。
    如果有。设置一个就可以了。
    没有选择控制面板中的添加/删除程序,之后点选项卡中的WINDOWS安装程序。。找到“辅助选项”之后在光驱中放入WINDOWS安装盘就行了。
    嘻嘻~~~~((是不是太罗嗦了。。这个人家还不知道~~~~~!!!!))
      

  3.   

    好多的API呀!
    都干嘛使得?
    是钩子么?真复杂!