Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
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
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 Long
Public Const WM_HOTKEY = &H312
Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
Public Const GWL_WNDPROC = (-4)
Public preWinProc As Long
Public Modifiers As Long, uVirtKey As Long, idHotKey As Long
Private Type taLong
ll As Long
End Type
Private Type t2Int
lWord As Integer
hword As Integer
End Type
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
If wParam = idHotKey Then
Dim lp As taLong, i2 As t2Int
lp.ll = lParam
LSet i2 = lp
If (i2.lWord = 0) And i2.hword = uVirtKey Then
Shell "notepad", vbNormalFocus '热键按下就启动纪事本
Beep
Debug.Print "G!"
End If
End If
End If
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
'以下在form中
Sub Form_Load()
Dim ret As Long
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
idHotKey = 1
Modifiers = 0
uVirtKey = vbKeyG '热键定为G
ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim ret As Long
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
Call UnregisterHotKey(Me.hwnd, uVirtKey)
End Sub
没有答在要点上,
我指的是程序在Load时就定义了一个热键,对应程序中的某一功能(子程序).
之后,不论该程序是否是当前窗口,是否具有焦点,都能响应这个热键。
有点类似于在Snagit抓图软件中,只要程序已运行,不管它是不是当前的,都可按Ctrl+P进行抓图。
我已经知道这个功能要用API,用SetWindowsHookEx()
Private Sub Form_Load()
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf Myfunc, , 0)
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnhookWindowsHookEx (hHook)
End Sub
'Myfunc()是这个功能子函数
Function Myfunc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If wParam = 18(假设是响应Alt键) Then
.....
Myfunc = 1
Exit Function
End If
Myfunc = CallNextHookEx(hHook, ncode, wParam, lParam)
End Function