Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As IntegerPrivate Sub Timer1_Timer() Dim i As Integer i = GetAsyncKeyState(vbKeyF2) If (i And 1) <> 0 Then '播放声音 End If End Sub
yachong(蚜虫),不行啊。如果界面失去焦点时按F2键就没用了的
很简单的东西模块Option Explicit Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, _ ByVal ID As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, _ ByVal ID As Long) As LongPublic Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long) As LongPublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic 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 LongPublic Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal _ hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As LongPublic Const WM_HOTKEY = &H312 Public Const GWL_WNDPROC = -4 Public Const WM_SETHOTKEY = &H32Public Const MOD_CTRL = &H2 Public Const MOD_SHFT = &H4 Public Const MOD_ALT = &H1 Private Const VK_DELETE = &H2E Private Const VK_INSERT = &H2D'Public Const HOTKEYF_SHIFT = &H1 '注释: shift键 'Public Const HOTKEYF_CONTROL = &H2 '注释:ctrl键 'Public Const HOTKEYF_ALT = &H4 '注释:alt键'Public Const VK_NUMPAD0 = &H60 'Public Const VK_NUMPAD1 = &H61 'Public Const VK_NUMPAD2 = &H62 'Public Const VK_NUMPAD3 = &H63 'Public Const VK_NUMPAD4 = &H64 'Public Const VK_NUMPAD5 = &H65 'Public Const VK_NUMPAD6 = &H66 'Public Const VK_NUMPAD7 = &H67 'Public Const VK_NUMPAD8 = &H68 'Public Const VK_NUMPAD9 = &H69 'Public Const VK_MULTIPLY = &H6A 'Public Const VK_ADD = &H6B 'Public Const VK_SEPARATOR = &H6C 'Public Const VK_SUBTRACT = &H6D 'Public Const VK_DECIMAL = &H6E 'Public Const VK_DIVIDE = &H6F Public Const VK_F1 = &H70 Public Const VK_F2 = &H71 Public Const VK_F3 = &H72 Public Const VK_F4 = &H73 Public Const VK_F5 = &H74 Public Const VK_F6 = &H75 Public Const VK_F7 = &H76 Public Const VK_F8 = &H77 Public Const VK_F9 = &H78 Public Const VK_F10 = &H79 Public Const VK_F11 = &H7A Public Const VK_F12 = &H7B Public Const VK_F13 = &H7C Public Const VK_F14 = &H7D Public Const VK_F15 = &H7E Public Const VK_F16 = &H7F Public Const VK_F17 = &H80 Public Const VK_F18 = &H81 Public Const VK_F19 = &H82 Public Const VK_F20 = &H83 Public Const VK_F21 = &H84 Public Const VK_F22 = &H85 Public Const VK_F23 = &H86 Public Const VK_F24 = &H87Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Public glWinRet As Long, preWinProc As Long Public unloadHotKey As IntegerPublic Function CallbackMsgs(ByVal wHwnd As Long, ByVal wMsg As Long, ByVal wp_id As Long, ByVal lp_id As Long) As Long If wMsg = WM_HOTKEY Then Call DoFunctions(wp_id) CallbackMsgs = 1 Exit Function End If CallbackMsgs = CallWindowProc(glWinRet, wHwnd, wMsg, wp_id, lp_id) End FunctionPrivate Function DoFunctions(ByVal vKeyID As Long) On Error Resume Next
If vKeyID = 1003 Then Beep 800, 2000 Exit Function End IfEnd Function窗体Private Sub Form_Load() preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) glWinRet = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf CallbackMsgs) '调用函数 RegisterHotKey Me.hwnd, 1003, 0, vbKeyF2 End SubPrivate Sub Form_Unload(Cancel As Integer) SetWindowLong Me.hwnd, GWL_WNDPROC, preWinProc End Sub
to chenhui530(陈辉) 你这样写 把系统注册的热键给抢掉了,在windows里f2是重命名的快捷键(选中一个文件点f2可以方便的改名)而按你这么做重命名的功能就失效了。
Dim i As Integer
i = GetAsyncKeyState(vbKeyF2) If (i And 1) <> 0 Then
'播放声音
End If
End Sub
Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, _
ByVal ID As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, _
ByVal ID As Long) As LongPublic Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As LongPublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic 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 LongPublic Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal _
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As LongPublic Const WM_HOTKEY = &H312
Public Const GWL_WNDPROC = -4
Public Const WM_SETHOTKEY = &H32Public Const MOD_CTRL = &H2
Public Const MOD_SHFT = &H4
Public Const MOD_ALT = &H1
Private Const VK_DELETE = &H2E
Private Const VK_INSERT = &H2D'Public Const HOTKEYF_SHIFT = &H1 '注释: shift键
'Public Const HOTKEYF_CONTROL = &H2 '注释:ctrl键
'Public Const HOTKEYF_ALT = &H4 '注释:alt键'Public Const VK_NUMPAD0 = &H60
'Public Const VK_NUMPAD1 = &H61
'Public Const VK_NUMPAD2 = &H62
'Public Const VK_NUMPAD3 = &H63
'Public Const VK_NUMPAD4 = &H64
'Public Const VK_NUMPAD5 = &H65
'Public Const VK_NUMPAD6 = &H66
'Public Const VK_NUMPAD7 = &H67
'Public Const VK_NUMPAD8 = &H68
'Public Const VK_NUMPAD9 = &H69
'Public Const VK_MULTIPLY = &H6A
'Public Const VK_ADD = &H6B
'Public Const VK_SEPARATOR = &H6C
'Public Const VK_SUBTRACT = &H6D
'Public Const VK_DECIMAL = &H6E
'Public Const VK_DIVIDE = &H6F
Public Const VK_F1 = &H70
Public Const VK_F2 = &H71
Public Const VK_F3 = &H72
Public Const VK_F4 = &H73
Public Const VK_F5 = &H74
Public Const VK_F6 = &H75
Public Const VK_F7 = &H76
Public Const VK_F8 = &H77
Public Const VK_F9 = &H78
Public Const VK_F10 = &H79
Public Const VK_F11 = &H7A
Public Const VK_F12 = &H7B
Public Const VK_F13 = &H7C
Public Const VK_F14 = &H7D
Public Const VK_F15 = &H7E
Public Const VK_F16 = &H7F
Public Const VK_F17 = &H80
Public Const VK_F18 = &H81
Public Const VK_F19 = &H82
Public Const VK_F20 = &H83
Public Const VK_F21 = &H84
Public Const VK_F22 = &H85
Public Const VK_F23 = &H86
Public Const VK_F24 = &H87Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public glWinRet As Long, preWinProc As Long
Public unloadHotKey As IntegerPublic Function CallbackMsgs(ByVal wHwnd As Long, ByVal wMsg As Long, ByVal wp_id As Long, ByVal lp_id As Long) As Long
If wMsg = WM_HOTKEY Then
Call DoFunctions(wp_id)
CallbackMsgs = 1
Exit Function
End If
CallbackMsgs = CallWindowProc(glWinRet, wHwnd, wMsg, wp_id, lp_id)
End FunctionPrivate Function DoFunctions(ByVal vKeyID As Long)
On Error Resume Next
If vKeyID = 1003 Then
Beep 800, 2000
Exit Function
End IfEnd Function窗体Private Sub Form_Load()
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) glWinRet = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf CallbackMsgs) '调用函数
RegisterHotKey Me.hwnd, 1003, 0, vbKeyF2
End SubPrivate Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hwnd, GWL_WNDPROC, preWinProc
End Sub
你这样写 把系统注册的热键给抢掉了,在windows里f2是重命名的快捷键(选中一个文件点f2可以方便的改名)而按你这么做重命名的功能就失效了。
高度怀疑你是否实验了我的代码