如何设定程序内热键?

解决方案 »

  1.   

    '模块代码
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
      (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
      (ByVal hwnd As Long, ByVal nIndex 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 Long
    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 LongPublic Const WM_HOTKEY = &H312
    Public Const MOD_ALT = &H1
    Public Const MOD_CONTROL = &H2
    Public Const MOD_SHIFT = &H4
    Public Const GWL_WNDPROC = (-4)Public preWinProc As Long
    Public Modifiers As Long, uVirtKey As Long, idHotKey As LongPrivate Type taLong
       ll As Long
    End Type
    Private Type t2Int
       lWord As Integer
       hword As Integer
    End Type
     Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
                             ByVal wParam As Long, ByVal lParam As Long) As Long
     If Msg = WM_HOTKEY Then
        If wParam = idHotKey Then
           Dim lp As taLong, i2 As t2Int
           lp.ll = lParam
           LSet i2 = lp
           If (i2.lWord = Modifiers) And i2.hword = uVirtKey Then
              Debug.Print "HotKey Shift-Alt-G Pressed "'捕捉到按下热
           End If
       End If
     End If
     '将之送往原来的Window Procedure
     wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
     End Function
    '窗体代码
    Sub Form_Load()
     Dim ret As Long
     preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
     ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
     idHotKey = 1 'in the range &h0000 through &hBFFF
     Modifiers = MOD_ALT + MOD_SHIFT
     uVirtKey = vbKeyF5
     ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
     End Sub Private Sub Form_Unload(Cancel As Integer)
     Dim ret As Long
     '取消Message的截取,而使之又只送往原来的Window Procedure
     ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
     Call UnregisterHotKey(Me.hwnd, uVirtKey)
     End Sub
      

  2.   

    难道我定义一个ctrl+o,打开一个窗体,都这么麻烦?要写好多代码哦。