这是我的一个程序的一部分,你自己看看吧,把控件剔出。 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
窗体的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
用控件数组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
窗体的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
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
if shift and vbshiftmask then
select case keycode
case vbkey1
commandbutton1.value=1
case vbkey2
commandbutton2.value=1
'以此类推
end select
end if
end sub
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
以下代码,仅供参考。。只有在按钮获得焦点时才能使用热键
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