我想定义一些热键,就像金山词霸的那样,在一个textbox里,当按下ctrl,alt,shift时显示"ctrl+alt+",松开后显示无,只有当同时按下其他键时timer终止检测,将如ctrl+alt+shift+F1之类的热键存在注册表,其实这应该是段经典的定义热键的代码,可惜我没找到让我满意的,我自己做的总有些问题,还请各位高手给出一段,我可用分很多,一定给分!

解决方案 »

  1.   

    '--------热键定义API----------------
    '使任务栏显示图标,重复调用了前两个API,将其全局定义
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
        (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
        (ByVal hWnd As Long, ByVal nIndex As Long) As Long
        
    Private 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
    Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, _
        ByVal ID As Long, ByVal fskey_Modifiers As Long, ByVal vk As Long) As Long
    Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, _
        ByVal ID As Long) As LongConst WM_HOTKEY = &H312
    Const MOD_ALT = &H1
    Const MOD_CONTROL = &H2
    Const MOD_SHIFT = &H4
    Const GWL_WNDPROC = (-4)        '窗口函数的地址Dim Key_pWp As Long             '用来保存窗口信息
    Dim Key_Mod As Long, Key_uVK As Long, Key_ID As Long
    Dim Key_isWinAdd    As Boolean  '是否取得窗口信息的判断
    '------------------------------------'过程:注册热键
    Public Sub HotKeyIn()
        '------------------------------------------
        SetHotkey 1, "38", "Add"
        SetHotkey 2, "40", "Add"
        SetHotkey 3, "38", "Add"
        SetHotkey 4, "40", "Add" '下
    End SubFunction keyWndproc(ByVal hWnd As Long, ByVal Msg As Long, _
        ByVal wParam As Long, ByVal lParam As Long) As Long    If Msg = WM_HOTKEY Then
            Select Case wParam 'wParam 值就是 key_id
                '激活热键后,热键所对应的操作,可在其他的程序中,在此处 调用就可以了
                Case 1
                
                Case 2
               
                Case 3
                
                Case 4
                
            End Select
        End If
            
        '将消息传送给指定的窗口
        keyWndproc = CallWindowProc(Key_pWp, hWnd, Msg, wParam, lParam)
            
    '----------在窗体 Form_Load 事件中定义热键格式------------------    'SetHotkey 1, "Ctrl,112", "Add"         ' 按 Ctrl+F1 激活指定程序
        'SetHotkey 2, 113, "Add"                '按 F2 激活指定程序
        'SetHotkey 3, "Ctrl+Alt,113", "Add"     '按 Ctrl+Alt+F2 激活指定程序
        
    '注:关于激活热键后的操作,由自定义函数 SetHotkey 的 KeyId 传送的值来判断'----------在窗体 Form_Unload 事件中注销热键格式----------------    'SetHotkey 1, "", "Del"                  ' 退出程序是一定要用上的,不然会导至程序死掉
        'SetHotkey 2, "", "Del"
        'SetHotkey 3, "", "Del"
        
    '---------------------------------------------------------------
    End FunctionFunction SetHotkey(ByVal KeyId As Long, ByVal KeyAss0 As String, _
        ByVal Action As String)
        Dim lKey As Long
        Dim sKey As String
        Dim i As Long
            
        i = InStr(1, KeyAss0, ",")
        If i = 0 Then
            lKey = Val(KeyAss0)
            sKey = ""
        Else
            lKey = Right(KeyAss0, Len(KeyAss0) - i)
            sKey = Left(KeyAss0, i - 1)
        End If
            
        Key_ID = 0
        Key_Mod = 0
        Key_uVK = 0
            
        If Key_isWinAdd = False Then    '判断是否需要取得窗口信息,如果重复取得, _
            再最后恢复窗口时,将会造成程序死掉
            
            '记录原来的window程序地址
            Key_pWp = GetWindowLong(frmMain.hWnd, GWL_WNDPROC)
            
            '用自定义程序代替原来的window程序
            SetWindowLong frmMain.hWnd, GWL_WNDPROC, AddressOf keyWndproc
        End If    Key_ID = KeyId
        Select Case Action
            Case "Add"
                Select Case sKey
                    Case "Ctrl"
                        Key_Mod = MOD_CONTROL
                    Case "Alt"
                        Key_Mod = MOD_ALT
                    Case "Shift"
                        Key_Mod = MOD_SHIFT
                    Case "Ctrl+Alt"
                        Key_Mod = MOD_CONTROL + MOD_ALT
                    Case "Ctrl+Shift"
                        Key_Mod = MOD_CONTROL + MOD_SHIFT
                    Case "Ctrl+Alt+Shift"
                        Key_Mod = MOD_CONTROL + MOD_ALT + MOD_SHIFT
                    Case "Shift+Alt"
                        Key_Mod = MOD_SHIFT + MOD_ALT
                End Select
                Key_uVK = Val(lKey)
                '向窗口注册系统热键
                RegisterHotKey frmMain.hWnd, Key_ID, Key_Mod, Key_uVK
                '不需要再取得窗口信息
                Key_isWinAdd = True
                            
            Case "Del"
                SetWindowLong frmMain.hWnd, GWL_WNDPROC, Key_pWp '恢复窗口信息
                UnregisterHotKey frmMain.hWnd, Key_uVK     '取消系统热键
                Key_isWinAdd = False    '可以再次取得窗口信息
        End Select
    End Function
      

  2.   

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer 
           Private Function MyHotKey(vKeyCode) As Boolean 
              MyHotKey = ((GetAsyncKeyState(vKeyCode) < 0)) 
           End Function 
         然后,建立一个 timer 控件,输入以下代码:
            Sub timer1_timer() 
              If myHotKey(vbkeyX) then …  ' 这里的 vbkeyX 是指系统热键为 X
           End Sub
      

  3.   

    '我一般喜欢用定时器,98,2000都好使,并且容易调试
    Option Explicit
    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Private Const VK_CONTROL = &H11
    Private Const VK_F1 = &H70
    Private Const VK_SHIFT = &H10
    Private Const VK_ALT = &H12Private Sub Timer1_Timer()
      Dim intKey As Integer
      Dim lKey(3) As Long
      Dim sKey(3) As String
      Dim i As Integer
      lKey(0) = VK_CONTROL
      lKey(1) = VK_SHIFT
      lKey(2) = VK_ALT
      lKey(3) = VK_F1
      sKey(0) = "Ctrl"
      sKey(1) = "SHIFT"
      sKey(2) = "ALT"
      sKey(3) = "F1"
      
      Text1 = ""
      For i = 0 To 3
         intKey = (GetAsyncKeyState(lKey(i)) And &HFF00) / 2 ^ 15
         If intKey = -1 Then
            Text1 = Text1 + sKey(i) + "+"
         End If
      NextEnd Sub