要编译成exe文件才能出效果。'*************************** '模块代码Module1 '*************************** Option ExplicitPrivate Declare Function CallNextHookEx Lib "user32" _ (ByVal hHook As Long, _ ByVal nCode As Long, _ ByVal wParam As Long, _ lParam As Any) As Long
Private Declare Function SetWindowsHookEx Lib "user32" _ Alias "SetWindowsHookExA" _ (ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" _ (ByVal hHook As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (Destination As Any, _ Source As Any, _ ByVal Length As Long)Private Type PKBDLLHOOKSTRUCT vkCode As Long scanCode As Long flags As Long time As Long dwExtraInfo As Long End TypePrivate Const WM_KEYDOWN = &H100 Private Const WM_SYSKEYDOWN = &H104 Private Const WM_KEYUP = &H101 Private Const WM_SYSKEYUP = &H105Private Const VK_LWIN = &H5B Private Const VK_RWIN = &H5CPrivate Const HC_ACTION = 0 Private Const WH_KEYBOARD_LL = 13Private Const VK_CONTROL = &H11 Private Const VK_ESCAPE = &H1B Private Const VK_MENU = &H12 Private Const VK_TAB = &H9 Private Const VK_Delete = &H2E Private lngHook As Long'使用底层KeyboardHook拦截按键消息 Public Function LowLevelKeyboardProc(ByVal nCode As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Dim blnHook As Boolean Dim p As PKBDLLHOOKSTRUCT
If nCode = HC_ACTION Then Select Case wParam Case WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP Call CopyMemory(p, ByVal lParam, Len(p)) If p.vkCode = VK_LWIN Or p.vkCode = VK_RWIN Then blnHook = True '按下了左/右Win键 If p.vkCode = VK_CONTROL Or p.vkCode = VK_ESCAPE Then blnHook = True '按下了Ctrl+Esc键 If p.vkCode = VK_MENU Or p.vkCode = VK_TAB Then blnHook = True '按下了Alt+Tab键 Case Else 'do nothing End Select End If
If blnHook Then LowLevelKeyboardProc = 1 Else Call CallNextHookEx(WH_KEYBOARD_LL, nCode, wParam, lParam) End If End FunctionPublic Sub HooK() lngHook = SetWindowsHookEx(WH_KEYBOARD_LL, _ AddressOf LowLevelKeyboardProc, _ App.hInstance, _ 0) End SubPublic Sub UnHooK() Call UnhookWindowsHookEx(lngHook) End Sub'*************************** '窗体代码Form1 '***************************Private Sub Form_Load() Call HooK '屏蔽Win键 End SubPrivate Sub Form_Unload(Cancel As Integer) Call UnHooK '取消屏蔽Win键 End Sub这只是简单的屏蔽了几个键,当然如果要屏蔽更多的键,只要在模块的LowLevelKeyboardProc函数中设置你想要拦截键盘键值过滤掉就可以了。
'API CallNextHookEx Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long _ , ByVal wParam As Long, lParam As Any) As Long琢磨CallNextHookEx的参数含义 和函数功能中 Being dizzy.......
Public Sub HooK() lngHook = SetWindowsHookEx(WH_KEYBOARD_LL, _ AddressOf LowLevelKeyboardProc, _ App.hInstance, _ 0) End SubMSDN上,SetWindowsHookEx函数说明是英文版的,看起来颇费力。 求教高手 (1)WH_KEYBOARD_LL 这个 常量在 API浏览器中找不着,请问这个参数代表什么? (2)Address Of LowLevelKeyboardProc, 这个参数的意思是什么?按Windows键的时候 LowLevelKeyboardProc的值会被 赋值成 “1”,那 Address Of “1” (3)App.hInstance msdn上说这个是 “返回应用程序的事例”,这也忒抽象了。请高手参照监视表 简单说下App.hInstance的意思吧(4)0 as long. - - 求解释
标准Windows键盘上都有一个Windows徽标键(即键盘上带有窗口图案的键),它的作用是和其他键配合完成一些针对Windows的快捷操作,如“Windows徽标键+D”可以立即显示桌面,“Windows徽标键+L”可以快速锁定计算机(针对Windows XP)等,为我们使用计算机提供了更为快捷的方法。
不过,有些用户并不喜欢Windows徽标键,那么你可以通过修改注册表来停用Windows徽标键:打开注册表编辑器,依次展开 [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layout]分支,然后在右侧窗口中找到或者新建一个名为“Scancode Map”的“REG_BINARY(二进制)”子项,双击该子项,将其键值设置为00 00 00 00 00 00 00 00 02 00 00 00 00 00 5b e0 00 00 00 00)
两个都锁了:
00 00 00 00 00 00 00 00 03 00 00 00 00 00 5b e0 00 00 5c e0 00 00 00 00
然后关掉注册表,
"开始"-->"注销"
ok!!,左边的win键被屏蔽了,右边那个工作正常!
Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,00,00,5b,e0,00,00,00,00
'模块代码Module1
'***************************
Option ExplicitPrivate Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(Destination As Any, _
Source As Any, _
ByVal Length As Long)Private Type PKBDLLHOOKSTRUCT
vkCode As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End TypePrivate Const WM_KEYDOWN = &H100
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYUP = &H105Private Const VK_LWIN = &H5B
Private Const VK_RWIN = &H5CPrivate Const HC_ACTION = 0
Private Const WH_KEYBOARD_LL = 13Private Const VK_CONTROL = &H11
Private Const VK_ESCAPE = &H1B
Private Const VK_MENU = &H12
Private Const VK_TAB = &H9
Private Const VK_Delete = &H2E
Private lngHook As Long'使用底层KeyboardHook拦截按键消息
Public Function LowLevelKeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim blnHook As Boolean
Dim p As PKBDLLHOOKSTRUCT
If nCode = HC_ACTION Then
Select Case wParam
Case WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP
Call CopyMemory(p, ByVal lParam, Len(p))
If p.vkCode = VK_LWIN Or p.vkCode = VK_RWIN Then blnHook = True '按下了左/右Win键
If p.vkCode = VK_CONTROL Or p.vkCode = VK_ESCAPE Then blnHook = True '按下了Ctrl+Esc键
If p.vkCode = VK_MENU Or p.vkCode = VK_TAB Then blnHook = True '按下了Alt+Tab键
Case Else
'do nothing
End Select
End If
If blnHook Then
LowLevelKeyboardProc = 1
Else
Call CallNextHookEx(WH_KEYBOARD_LL, nCode, wParam, lParam)
End If
End FunctionPublic Sub HooK()
lngHook = SetWindowsHookEx(WH_KEYBOARD_LL, _
AddressOf LowLevelKeyboardProc, _
App.hInstance, _
0)
End SubPublic Sub UnHooK()
Call UnhookWindowsHookEx(lngHook)
End Sub'***************************
'窗体代码Form1
'***************************Private Sub Form_Load()
Call HooK '屏蔽Win键
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call UnHooK '取消屏蔽Win键
End Sub这只是简单的屏蔽了几个键,当然如果要屏蔽更多的键,只要在模块的LowLevelKeyboardProc函数中设置你想要拦截键盘键值过滤掉就可以了。
'API CallNextHookEx
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long _
, ByVal wParam As Long, lParam As Any) As Long琢磨CallNextHookEx的参数含义 和函数功能中
Being dizzy.......
Public Sub HooK()
lngHook = SetWindowsHookEx(WH_KEYBOARD_LL, _
AddressOf LowLevelKeyboardProc, _
App.hInstance, _
0)
End SubMSDN上,SetWindowsHookEx函数说明是英文版的,看起来颇费力。
求教高手
(1)WH_KEYBOARD_LL 这个 常量在 API浏览器中找不着,请问这个参数代表什么?
(2)Address Of LowLevelKeyboardProc, 这个参数的意思是什么?按Windows键的时候
LowLevelKeyboardProc的值会被 赋值成 “1”,那 Address Of “1”
(3)App.hInstance msdn上说这个是 “返回应用程序的事例”,这也忒抽象了。请高手参照监视表
简单说下App.hInstance的意思吧(4)0 as long. - - 求解释
给你个参考: http://www.m5home.com/blog/article.asp?id=2452,这个意思你直接在addressof上按F1就有答案了,除非你没装MSDN.
它是取得后面所跟的公共函数或过程的地址,一般用于API回调.3,App.hInstance也如上一条一样,按F1就会有详细的答案.
既然你还未到不使用MSDN的地步,建议还是装上吧.4,我不知道你这段代码在哪里,没看明白.