SetWindowsHookEx不行,只能拦截本进程的,全局单纯vb做不到(必须dll中)
据我所知有以下两种方法hook全局输入:
Dinput: 就是所谓全局hook了,可拦截所有输入和其他,但复杂,且没必要为了一个键hook全部
JournalRecord: 可能很少人知道这个,这个就是全局inputhook又不用在dll中的超级方法,而且是API不用象DX那样需要另外的库支持,但一个system只能有一个!
根据你的题目要求,你只是有一个热键就行了,那么有如下方法:
WM_SETHOTKEY:对某窗口发这个就可以设定一个热键,当按下时就可以激活这个窗口,但它只是激活,不对应程序中的函数,需要你自己根据窗口的激活事件再运行特定的函数,不太好,所以还有这个:
RegisterHotKey: 这是window专门用来设定热键的,按下后可会发回WM_HOTKEY消息,配合SetWindowLong就可以回调你指定的函数,是热键问题的最佳解决方法!
如下是RegisterHotKey的例子:
'以下在.bas中
Option Explicit
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
详细用法自己参考MSDN。
以上是我的一些经验,如果哪位朋友还知道其他方法贴出来共享!