热键程序的API与AESII我会写.但是我关键一个问题就是热键的设置与组合问题。像QQ或者金山快译的热键设置时,文本框可以自动检测,我输的入的组合键,并且是在一次操作完成的。是如何实现这些功能的呢?
例如:
1.我按下CTRL+A他会自动检测到我按了两个键,
2.ALT+CTRL+1 他会自动检测了我按了三个键,并且按我的先后顺序排列。
3.我只输入B他就自动检测一个键。以上的热键设置时的设计流程如何,是否要用时间控件来检测呢?有相关的例子吗?

解决方案 »

  1.   

    我的程序中的一部分:Dim SetKeyCode As Integer, SetKeyShift As IntegerPrivate Declare Function GetKeyNameText Lib "user32.dll" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long
    Private Declare Function MapVirtualKey Lib "user32.dll" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As LongPrivate Sub TextHotKey_KeyDown(KeyCode As Integer, Shift As Integer)
        SetKeyShift = Shift
        If KeyCode > 20 Then SetKeyCode = KeyCode Else SetKeyCode = 0
        Show_Key
    End SubPrivate Sub TextHotKey_KeyUp(KeyCode As Integer, Shift As Integer)
        If SetKeyCode = 0 And Shift = 0 Then SetKeyShift = 0: Show_Key
    End SubPrivate Sub Show_Key()
        If SetKeyCode = 0 And SetKeyShift = 0 Then TextHotKey.Text = "无": Exit Sub
        
        Dim KeyName As String
        
        If SetKeyShift And 1 Then KeyName = KeyName & "Shift + "
        If SetKeyShift And 2 Then KeyName = KeyName & "Ctrl + "
        If SetKeyShift And 4 Then KeyName = KeyName & "Alt + "
        
        Dim kn As String * 20, l As Long
        l = GetKeyNameText(MapVirtualKey(SetKeyCode, 0) * 65536 + 1, kn, 19)
        KeyName = KeyName & Left$(kn, l)
        
        TextHotKey.Text = KeyName
    End Sub
    需要一个Text,名字为TextHotKey。而且,TextHotKey要locked=true。
      

  2.   

    设置完毕后,SetKeyCode可以直接用于注册系统热键,而SetKeyShift需要转换。1<=>4(最后一位和倒数第三位对调)
    我的程序中是这样的:
        Modifiers = 0
        If SetKeyShift And 1 Then Modifiers = Modifiers + 4
        If SetKeyShift And 2 Then Modifiers = Modifiers + 2
        If SetKeyShift And 4 Then Modifiers = Modifiers + 1Modifiers 和 SetKeyCode 就可以用了。
      

  3.   

    高手啊,这个问题放在我心中差不我有一年了,都不能解决,想不到在这里20分钟后就有人帮我解答,高手如云。我再问一个问题如何把这些设好了的热键,注册到WINDOWS里,把他们用起来呢?最好有一
    些祥细的便例子
      

  4.   

    不明白
    你的意思是这样吗:假如一个窗体设置了热键(如ctrl+atl+b)
    当窗体最小化时只要按这三个键就可以显示窗体吗
    若是这样,我做过,不用时间控件.
      

  5.   

    要两个API函数
    Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
    Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long注册系统热键:
        If SetKeyCode Then RegisterHotKey Me.hwnd, 1, Modifiers, SetKeyCode
    解除:
        UnregisterHotKey Me.hwnd, 1
    (其中这个1是个编号,可以自己定义。如果要多个热键,要设置成不同的编号。)
    另外,注册后,系统会向窗口发消息。需要重定义窗口函数。
    定义窗口函数:
        lpPrevWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    还原:
        SetWindowLong Me.hwnd, GWL_WNDPROC, lpPrevWndProc很重要的是,要在模块中加入如下代码:
    Public Const WM_HOTKEY = &H312
    Public Const GWL_WNDPROC = (-4)
    Public lpPrevWndProc As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    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 LongFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If uMsg = WM_HOTKEY Then
            If wParam = 1 Then    '这个1还是编号
                '你要做什么写在这里。比如说 Form1.Show 。注意,这里不能用Me。
            End If
        End If
        WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
    End Function