请问各位大虾 :
    
    我在form上有九个textbox(textbox1,textbox2,textbox3....),我现在想,无论焦点在那个textbox上,或在form的任何位置, 按"F12" 都触发同一个事件,但我不想在form上的每一个控件上都加上keydown事件,简单的说,就是在这个form上,任何时候任何地方,按"F12",都触发同一个事件,而且不用写那么多的代码.

解决方案 »

  1.   

    给你个例子,自己简化一下吧。
    Option Explicit
    Private Const MOD_ALT = &H1
    Private Const MOD_CONTROL = &H2
    Private Const MOD_SHIFT = &H4
    Private Const PM_REMOVE = &H1
    Private Const WM_HOTKEY = &H312
    Private Type POINTAPI
        x As Long
        y As Long
    End Type
    Private Type Msg
        hWnd As Long
        Message As Long
        wParam As Long
        lParam As Long
        time As Long
        pt As POINTAPI
    End Type
    Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
    Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As Long
    Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
    Private Declare Function WaitMessage Lib "user32" () As Long
    Private bCancel As BooleanPrivate Sub ProcessMessages()
        Dim Message As Msg
        'loop until bCancel is set to True
        Do While Not bCancel
            'wait for a message
            WaitMessage
            'check if it's a HOTKEY-message
            If PeekMessage(Message, Me.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
                Call Command1_Click
            End If
            'let the operating system process other events
            DoEvents
        Loop
    End SubPrivate Sub Form_Load()
        Dim ret As Long
        bCancel = False
        'register the Ctrl-F hotkey
        ret = RegisterHotKey(Me.hWnd, &HBFFF&, MOD_CONTROL, vbKeyF12)
        'show some information
        Me.AutoRedraw = True
        Me.Print "Press CTRL-F12 to show the message"
        'show the form and
        Show
        'process the Hotkey messages
        ProcessMessages
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        bCancel = True
        'unregister hotkey
        Call UnregisterHotKey(Me.hWnd, &HBFFF&)
    End SubPrivate Sub Command1_Click()
        MsgBox "Click me!"
    End Sub
      

  2.   

    上面的是用API来实现,来一个不用API的:(思想)定义一个事件过程:
    private sub myeven
    end sub然后利用keyUP事件来捕捉按的键,如果是F12那么就调用myeven事件过程功能键代码:
    功能键
    常数     值 描述 
    vbKeyF1 112 F1 键 
    vbKeyF2 113 F2 键 
    vbKeyF3 114 F3 键 
    vbKeyF4 115 F4 键 
    vbKeyF5 116 F5 键 
    vbKeyF6 117 F6 键 
    vbKeyF7 118 F7 键 
    vbKeyF8 119 F8 键 
    vbKeyF9 120 F9 键 
    vbKeyF10 121 F10 键 
    vbKeyF11 122 F11 键 
    vbKeyF12 123 F12 键 
    vbKeyF13 124 F13 键 
    vbKeyF14 125 F14 键 
    vbKeyF15 126 F15 键 
    vbKeyF16 127 F16 键 
      

  3.   

    form.KeyPreview =True
    然后就会先执行form的KeyDown的代码。
      

  4.   

    Private Sub Form_Load()
       KeyPreview = True
    End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
       Select Case KeyCode
          Case vbKeyF1: MsgBox "F1 is your friend."
          Case vbKeyF2: MsgBox "F2 could copy text."
          Case vbKeyF3: MsgBox "F3 could paste text."
          Case vbKeyF4: MsgBox "F4 could format text."
       End Select
    End Sub
      

  5.   

    這個簡單的問題那裡要什麼api函數
    用 czw1975(塞饭)的方法就行了
    只是設置form.KeyPreview =True
    Form1_KeyDown事件就會首先響應所有的鍵盤事件,不知道會不會影響樓主程序的其他地方
      

  6.   

    注意 一些控件能够拦截键盘事件,以致窗体不能接收它们。这样的例子有:CommandButton 控件有焦点时的 ENTER 键、以及焦点在 ListBox 控件上时的方向键。