如何在窗体中监听F1-F12功能键阿!可否给出代码,不胜感谢!

解决方案 »

  1.   

    Option Explicit
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Public 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 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_CONTROL = &H2
    Public Const GWL_WNDPROC = (-4)Public hWndLong(1 To 2) As Long
    Public Modifiers As Long, uVirtKey As Long, idHotKey As Long
    Dim S1 As Long
    Dim S2 As Long
    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
            Select Case wParam
                Case 1&
                    MsgBox "F1"
                Case 2&
                    MsgBox "F2"
            End Select
        End If
        
        If wParam = 1& Then
            WndProc = CallWindowProc(hWndLong(1), hwnd, Msg, wParam, lParam)
        Else
            WndProc = CallWindowProc(hWndLong(2), hwnd, Msg, wParam, lParam)
        End If
    End Function
    ==================================
    Option ExplicitSub UnHook(ByVal hWnd1 As Long, ByVal hWnd2 As Long)
        Dim ret As Long
        ret = SetWindowLong(hWnd1, GWL_WNDPROC, hWndLong(1))
        Call UnregisterHotKey(hWnd1, uVirtKey)
        ret = SetWindowLong(hWnd2, GWL_WNDPROC, hWndLong(2))
        Call UnregisterHotKey(hWnd2, uVirtKey)
    End SubSub RegHook(ByVal hWnd1 As Long, ByVal hWnd2 As Long)
        Dim ret As Long
        
        hWndLong(1) = GetWindowLong(hWnd1, GWL_WNDPROC)
        ret = SetWindowLong(hWnd1, GWL_WNDPROC, AddressOf WndProc)
        idHotKey = 1
        Modifiers = 0&
        uVirtKey = vbKeyF1
        ret = RegisterHotKey(hWnd1, idHotKey, Modifiers, uVirtKey)
        
        hWndLong(2) = GetWindowLong(hWnd2, GWL_WNDPROC)
        ret = SetWindowLong(hWnd2, GWL_WNDPROC, AddressOf WndProc)
        idHotKey = 2
        Modifiers = 0&
        uVirtKey = vbKeyF2
        ret = RegisterHotKey(hWnd2, idHotKey, Modifiers, uVirtKey)
    End SubPrivate Sub Form_Load()
        RegHook Command1.hwnd, Command2.hwnd
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        UnHook Command1.hwnd, Command2.hwnd
    End Sub
      

  2.   

    Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
        If KeyCode = vbKeyF5 Then
            '通知所有主机刷新
        End If
    End Sub这个是按F5的情况,依此类推
      

  3.   

    干嘛这么麻烦,在窗体的keydown事件处理
    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
    Case vbKeyF1
        MsgBox "F1"
    Case vbKeyF2
        MsgBox "F2"
    Case vbKeyF3
        MsgBox "F3"
    Case vbKeyF4
        MsgBox "F4"
    Case vbKeyF5
        MsgBox "F5"
    Case vbKeyF6
        MsgBox "F6"
    Case vbKeyF7
        MsgBox "F7"
    Case vbKeyF8
        MsgBox "F8"
    Case vbKeyF9
        MsgBox "F9"
    Case vbKeyF10
        MsgBox "F10"
    Case vbKeyF11
        MsgBox "F11"
    Case vbKeyF12
        MsgBox "F12"
    End Select
    End Sub
      

  4.   

    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
        If KeyCode >= 112 And KeyCode <= 123 Then
            MsgBox "F" & CStr(KeyCode - 111)
        End If
    End Sub
      

  5.   

    使用 frankwong的代码倒是可以,只是当焦点在窗体中的控件上的时候就监听不到了,该如何解决阿!