既然有分就不能放过. 下面是你想要的代码: 这些放在标准模块里 Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Private 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 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 LongPrivate Const WM_HOTKEY = &H312 Private Const MOD_ALT = &H1 Private Const MOD_CONTROL = &H2 Private Const MOD_SHIFT = &H4 Private Const GWL_WNDPROC = (-4)Private preWinProc As Long Private Modifiers As Long, uVirtKey As Long, idHotKey As LongPrivate Type taLong ll As Long End TypePrivate Type t2Int lWord As Integer hWord As Integer End TypePrivate Function Wndproc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_HOTKEY And Form1.WindowState = 1 Then If wParam = idHotKey Then Dim lp As taLong, i2 As t2Int lp.ll = lParam LSet i2 = lp If (i2.lWord = Modifiers) And i2.hWord = uVirtKey Then '按键后要执行的代码 End If End If End If '如果不是热键信息则调用原来的程序 Wndproc = CallWindowProc(preWinProc, hWnd, Msg, wParam, lParam)End Function Public Sub LoadHotKey(Frm As Form) Dim ret As Long '记录原来的window程序地址 preWinProc = GetWindowLong(Frm.hWnd, GWL_WNDPROC) '用自定义程序代替原来的window程序 ret = SetWindowLong(Frm.hWnd, GWL_WNDPROC, AddressOf Wndproc) idHotKey = 1 Modifiers = MOD_CONTROL 'MOD_ALT + MOD_CONTROL 'Alt+Ctrl 键 uVirtKey = vbKeyZ '这里是Z,自己去查/的常数值 ret = RegisterHotKey(Frm.hWnd, idHotKey, Modifiers, uVirtKey) End Sub Public Sub UnLoadHotkey(Frm As Form) Dim ret As Long '取消Message的截取,使之送往原来的windows程序 ret = SetWindowLong(Frm.hWnd, GWL_WNDPROC, preWinProc) Call UnregisterHotKey(Frm.hWnd, uVirtKey) End Sub 事件代码 Private Sub Form_Load() LoadHotKey Me'加载热键 End Sub Private Sub Form_Unload(Cancel As Integer) UnLoadHotkey Me'卸载 End Sub
下面是你想要的代码:
这些放在标准模块里
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private 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
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 LongPrivate Const WM_HOTKEY = &H312
Private Const MOD_ALT = &H1
Private Const MOD_CONTROL = &H2
Private Const MOD_SHIFT = &H4
Private Const GWL_WNDPROC = (-4)Private preWinProc As Long
Private Modifiers As Long, uVirtKey As Long, idHotKey As LongPrivate Type taLong
ll As Long
End TypePrivate Type t2Int
lWord As Integer
hWord As Integer
End TypePrivate Function Wndproc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HOTKEY And Form1.WindowState = 1 Then
If wParam = idHotKey Then
Dim lp As taLong, i2 As t2Int
lp.ll = lParam
LSet i2 = lp
If (i2.lWord = Modifiers) And i2.hWord = uVirtKey Then
'按键后要执行的代码
End If
End If
End If
'如果不是热键信息则调用原来的程序
Wndproc = CallWindowProc(preWinProc, hWnd, Msg, wParam, lParam)End Function
Public Sub LoadHotKey(Frm As Form)
Dim ret As Long
'记录原来的window程序地址
preWinProc = GetWindowLong(Frm.hWnd, GWL_WNDPROC)
'用自定义程序代替原来的window程序
ret = SetWindowLong(Frm.hWnd, GWL_WNDPROC, AddressOf Wndproc)
idHotKey = 1
Modifiers = MOD_CONTROL 'MOD_ALT + MOD_CONTROL 'Alt+Ctrl 键
uVirtKey = vbKeyZ '这里是Z,自己去查/的常数值
ret = RegisterHotKey(Frm.hWnd, idHotKey, Modifiers, uVirtKey)
End Sub
Public Sub UnLoadHotkey(Frm As Form)
Dim ret As Long
'取消Message的截取,使之送往原来的windows程序
ret = SetWindowLong(Frm.hWnd, GWL_WNDPROC, preWinProc)
Call UnregisterHotKey(Frm.hWnd, uVirtKey)
End Sub
事件代码
Private Sub Form_Load()
LoadHotKey Me'加载热键
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnLoadHotkey Me'卸载
End Sub