请高手指点下
我窗体内有 9个 按扭
要做9个热键
分别是
用alt + 1
alt + 2
..........
alt + 9
一个热键对应1个按扭
请发个源代码
谢谢
好代码追分

解决方案 »

  1.   

    这是我的一个程序的一部分,你自己看看吧,把控件剔出。
    Form Code:
    Sub RegHook()
        Dim ret As Long
        
        hWndLong(1) = GetWindowLong(Combo1.hwnd, GWL_WNDPROC)
        ret = SetWindowLong(Combo1.hwnd, GWL_WNDPROC, AddressOf WndProc)
        idHotKey = 1
        If Len(Combo1.Text) > 3 Then
            Modifiers = MOD_CONTROL
            uVirtKey = Asc(Right(Combo1.Text, 1))
        Else
            Modifiers = 0&
            Select Case Combo1.Text
                Case "F1": uVirtKey = vbKeyF1
                Case "F2": uVirtKey = vbKeyF2
                Case "F3": uVirtKey = vbKeyF3
                Case "F4": uVirtKey = vbKeyF4
                Case "F5": uVirtKey = vbKeyF5
                Case "F6": uVirtKey = vbKeyF6
                Case "F7": uVirtKey = vbKeyF7
                Case "F8": uVirtKey = vbKeyF8
                Case "F9": uVirtKey = vbKeyF9
                Case "F10": uVirtKey = vbKeyF10
                Case "F11": uVirtKey = vbKeyF11
                Case "F12": uVirtKey = vbKeyF12
            End Select
        End If
        ret = RegisterHotKey(Combo1.hwnd, idHotKey, Modifiers, uVirtKey)
        
        hWndLong(2) = GetWindowLong(Combo2.hwnd, GWL_WNDPROC)
        ret = SetWindowLong(Combo2.hwnd, GWL_WNDPROC, AddressOf WndProc)
        idHotKey = 2
        If Len(Combo2.Text) > 3 Then
            Modifiers = MOD_CONTROL
            uVirtKey = Asc(Right(Combo2.Text, 1))
        Else
            Modifiers = 0&
            Select Case Combo2.Text
                Case "F1": uVirtKey = vbKeyF1
                Case "F2": uVirtKey = vbKeyF2
                Case "F3": uVirtKey = vbKeyF3
                Case "F4": uVirtKey = vbKeyF4
                Case "F5": uVirtKey = vbKeyF5
                Case "F6": uVirtKey = vbKeyF6
                Case "F7": uVirtKey = vbKeyF7
                Case "F8": uVirtKey = vbKeyF8
                Case "F9": uVirtKey = vbKeyF9
                Case "F10": uVirtKey = vbKeyF10
                Case "F11": uVirtKey = vbKeyF11
                Case "F12": uVirtKey = vbKeyF12
            End Select
        End If
        ret = RegisterHotKey(Combo2.hwnd, idHotKey, Modifiers, uVirtKey)
    End Sub
    Module Code:
    Option ExplicitDeclare 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&
                    S1 = S1 + 1
                    If S1 Mod 2 = 1 Then
                        Main.Hide
                    Else
                        Main.Show
                    End If
                Case 2&
                    S2 = S2 + 1
                    If S2 Mod 2 = 1 Then
                        Main.Timer1.Enabled = False
                    Else
                        Main.Timer1.Enabled = True
                    End If
            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
      

  2.   

    窗体的KeyPreview属性设为Trueprivate sub form1_keydown(keycode as integer,shift as integer)
        if shift and vbshiftmask then
        select case keycode
        case vbkey1
            commandbutton1.value=1
        case vbkey2
            commandbutton2.value=1
        '以此类推
        end select
        end if
    end sub
      

  3.   

    用控件数组Private Sub Command1_Click(Index As Integer)
        Print "点击了cmd" & Index + 1
    End SubPrivate Sub Form_Load()
        For i = 0 To Command1.Count - 1
            Command1(i).Caption = "cmd&" & CStr(i + 1)
        Next
    End Sub
      

  4.   

    窗体的KeyPreview属性设为True,我试过,不行啊。。
    以下代码,仅供参考。。只有在按钮获得焦点时才能使用热键
     Sub Command1_Click()
    MsgBox "OK"
    End Sub
     Sub Command2_Click()
    MsgBox "你好"
    End Sub
     Sub Command3_Click()
    MsgBox "你好吗?"
    End Sub
     Sub Command4_Click()
    MsgBox "OK!!"
    End Sub
     Sub Command5_Click()
    MsgBox "谢谢"
    End Sub
     Sub Command6_Click()
    MsgBox "你是谁"
    End Sub
     Sub Command7_Click()
    MsgBox "保密"
    End Sub
     Sub Command8_Click()
    MsgBox "THANK"
    End Sub
     Sub Command9_Click()
    MsgBox "THANK YOU"
    End Sub
    Private Sub Command1_KeyDown(keycode As Integer, shift As Integer)
    If keycode = vbKeyAlt + vbKeyNumpad1 Then
    Call Command1_Click
    ElseIf keycode = vbKeyAlt + vbKey1 Then
    Call Command1_Click
    End If
    End SubPrivate Sub Command2_KeyDown(keycode As Integer, shift As Integer)
    If keycode = vbKeyAlt + vbKeyNumpad2 Then
    Call Command2_Click
    ElseIf keycode = vbKeyAlt + vbKey2 Then
    Call Command2_Click
    End If
    End Sub
    Private Sub Command3_KeyDown(keycode As Integer, shift As Integer)
    If keycode = vbKeyAlt + vbKeyNumpad3 Then
    Call Command3_Click
    ElseIf keycode = vbKeyAlt + vbKey3 Then
    Call Command3_Click
    End If
    End Sub
    Private Sub Command4_KeyDown(keycode As Integer, shift As Integer)
    If keycode = vbKeyAlt + vbKeyNumpad4 Then
    Call Command4_Click
    ElseIf keycode = vbKeyAlt + vbKey4 Then
    Call Command4_Click
    End If
    End Sub
    Private Sub Command5_KeyDown(keycode As Integer, shift As Integer)
    If keycode = vbKeyAlt + vbKeyNumpad5 Then
    Call Command5_Click
    ElseIf keycode = vbKeyAlt + vbKey5 Then
    Call Command5_Click
    End If
    End Sub
    Private Sub Command6_KeyDown(keycode As Integer, shift As Integer)
    If keycode = vbKeyAlt + vbKeyNumpad6 Then
    Call Command6_Click
    ElseIf keycode = vbKeyAlt + vbKey6 Then
    Call Command6_Click
    End If
    End Sub
    Private Sub Command7_KeyDown(keycode As Integer, shift As Integer)
    If keycode = vbKeyAlt + vbKeyNumpad7 Then
    Call Command7_Click
    ElseIf keycode = vbKeyAlt + vbKey7 Then
    Call Command7_Click
    End If
    End Sub
    Private Sub Command8_KeyDown(keycode As Integer, shift As Integer)
    If keycode = vbKeyAlt + vbKeyNumpad8 Then
    Call Command8_Click
    ElseIf keycode = vbKeyAlt + vbKey8 Then
    Call Command8_Click
    End If
    End Sub
    Private Sub Command9_KeyDown(keycode As Integer, shift As Integer)
    If keycode = vbKeyAlt + vbKeyNumpad9 Then
    Call Command9_Click
    ElseIf keycode = vbKeyAlt + vbKey9 Then
    Call Command9_Click
    End If
    End Sub