我想做个屏蔽热键和任务管理器的程序,但是用Hook会出现问题:我用open方法把任务管理器锁定了,启动程序后,如果按组合键(Ctrl+Alt+Del),在关闭程序后,会发现按某些键不正常(如win),要按一下Ctrl,Alt之类的键才正常.
'form1
Private Sub Form_Load()
Open "c:\windows\system32\taskmgr.exe" For Input Lock Read Write As #6
HOOK
End SubPrivate Sub Form_Unload(Cancel As Integer)
UNHOOK
End Sub'bas
'VB 屏蔽键盘(包含组合键)
Option Explicit
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
Public Type KEYMSGS
vKey As Long
sKey As Long
flag As Long
time As Long
End Type
Public Const TH32CS_SNAPPROCESS = &H2&
Public Const SPI_SCREENSAVERRUNNING = 97
Public Const WH_KEYBOARD_LL = 13
Public Const VK_LWIN = &H5B
Public Const VK_RWIN = &H5C
Public Const HC_ACTION = 0
Public Const HC_SYSMODALOFF = 5
Public Const HC_SYSMODALON = 4
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_SYSKEYDOWN = &H104
Public Const WM_SYSKEYUP = &H105
Public Const VK_BACK = &H8
Public Const VK_TAB = &H9
Public Const VK_ESCAPE = &H1B
Public Const VK_F5 = &H74
Public Const VK_CONTROL = &H11
Dim FileNumber As Integer
Public P As KEYMSGS
Public lHook As Long
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public Const VK_ATTN = &HF6
Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim fEatKeystroke As Boolean
If (nCode = HC_ACTION) Then
If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Or wParam = WM_KEYUP Or wParam = WM_SYSKEYUP Then
CopyMemory P, ByVal lParam, Len(P)
Select Case P.vKey
Case VK_LWIN, VK_RWIN '如果按了WIN键
fEatKeystroke = True '就吃了
Case VK_ESCAPE 'esc
fEatKeystroke = True
Case VK_F5 'f5
fEatKeystroke = True
Case 115 'F4
fEatKeystroke = True
Case 164, 165 'alt
fEatKeystroke = True
End Select
Debug.Print P.vKey
If P.vKey = 160 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+shift
If P.vKey = 161 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+shift
If P.vKey = 32 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+空格
If P.vKey = 78 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+n
If P.vKey = 82 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ r
If P.vKey = 81 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ q
If P.vKey = 87 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ w
If P.vKey = 69 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+e
If P.vKey = 73 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+i
If P.vKey = 79 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+o
If P.vKey = 80 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+p
If P.vKey = 68 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+d
If P.vKey = 70 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+f
If P.vKey = 72 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+h
If P.vKey = 76 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+l
If P.vKey = 78 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+n
If P.vKey = 66 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+b
If P.vKey = 37 And GetAsyncKeyState(VK_ATTN) Then fEatKeystroke = True 'ALT+<
If P.vKey = 39 And GetAsyncKeyState(VK_ATTN) Then fEatKeystroke = True 'ALT+<
End If
End If
If fEatKeystroke Then
LowLevelKeyboardProc = -1
Else
LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End If
End Function
Public Function HOOK() As Boolean
On Error GoTo errh
lHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
HOOK = True
Exit Function
errh:
HOOK = False
End Function
Public Sub UNHOOK()
UnhookWindowsHookEx lHook
End Sub
'form1
Private Sub Form_Load()
Open "c:\windows\system32\taskmgr.exe" For Input Lock Read Write As #6
HOOK
End SubPrivate Sub Form_Unload(Cancel As Integer)
UNHOOK
End Sub'bas
'VB 屏蔽键盘(包含组合键)
Option Explicit
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
Public Type KEYMSGS
vKey As Long
sKey As Long
flag As Long
time As Long
End Type
Public Const TH32CS_SNAPPROCESS = &H2&
Public Const SPI_SCREENSAVERRUNNING = 97
Public Const WH_KEYBOARD_LL = 13
Public Const VK_LWIN = &H5B
Public Const VK_RWIN = &H5C
Public Const HC_ACTION = 0
Public Const HC_SYSMODALOFF = 5
Public Const HC_SYSMODALON = 4
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_SYSKEYDOWN = &H104
Public Const WM_SYSKEYUP = &H105
Public Const VK_BACK = &H8
Public Const VK_TAB = &H9
Public Const VK_ESCAPE = &H1B
Public Const VK_F5 = &H74
Public Const VK_CONTROL = &H11
Dim FileNumber As Integer
Public P As KEYMSGS
Public lHook As Long
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public Const VK_ATTN = &HF6
Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim fEatKeystroke As Boolean
If (nCode = HC_ACTION) Then
If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Or wParam = WM_KEYUP Or wParam = WM_SYSKEYUP Then
CopyMemory P, ByVal lParam, Len(P)
Select Case P.vKey
Case VK_LWIN, VK_RWIN '如果按了WIN键
fEatKeystroke = True '就吃了
Case VK_ESCAPE 'esc
fEatKeystroke = True
Case VK_F5 'f5
fEatKeystroke = True
Case 115 'F4
fEatKeystroke = True
Case 164, 165 'alt
fEatKeystroke = True
End Select
Debug.Print P.vKey
If P.vKey = 160 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+shift
If P.vKey = 161 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+shift
If P.vKey = 32 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+空格
If P.vKey = 78 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+n
If P.vKey = 82 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ r
If P.vKey = 81 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ q
If P.vKey = 87 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ w
If P.vKey = 69 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+e
If P.vKey = 73 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+i
If P.vKey = 79 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+o
If P.vKey = 80 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+p
If P.vKey = 68 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+d
If P.vKey = 70 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+f
If P.vKey = 72 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+h
If P.vKey = 76 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+l
If P.vKey = 78 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+n
If P.vKey = 66 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+b
If P.vKey = 37 And GetAsyncKeyState(VK_ATTN) Then fEatKeystroke = True 'ALT+<
If P.vKey = 39 And GetAsyncKeyState(VK_ATTN) Then fEatKeystroke = True 'ALT+<
End If
End If
If fEatKeystroke Then
LowLevelKeyboardProc = -1
Else
LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End If
End Function
Public Function HOOK() As Boolean
On Error GoTo errh
lHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
HOOK = True
Exit Function
errh:
HOOK = False
End Function
Public Sub UNHOOK()
UnhookWindowsHookEx lHook
End Sub
我主要是要屏蔽Ctrl+Esc,Win,Alt+Esc,Alt+Tab,Tab,Ctrl+Shift,Ctrl+空格,Ctrl+Pause,F1,F3,F4,Ctrl,Alt,Shift等键,最好是所有键,但是除了Esc!
我觉得锁定任务管理器的方法已经相当好,不知道有没有更好的方法呢?
我连如何全局模拟按下或弹起之类的方法都不会,或者有人提供给我,我应该可以解决问题!
我连如何全局模拟按下或弹起之类的方法都不会,或者有人提供给我,我应该可以解决问题!
http://www.autohotkey.com
vKey As Long
sKey As Long
flag As Long
time As Long
End Type这个结构少了一个内容啊,应该还有个dwExtraInfo As Long,其他我没多看,结构不完整,内存拷贝后会不会有问题?
Open Environ$("WinDir") & "\system32\taskmgr.exe" For Binary As #1
End Sub
http://www.autohotkey.com