我想做个屏蔽热键和任务管理器的程序,但是用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

解决方案 »

  1.   

    其实这只是个例子,我是为了屏蔽热键和任务管理器,如果大家有好办法,希望帮忙发来看看!
    我主要是要屏蔽Ctrl+Esc,Win,Alt+Esc,Alt+Tab,Tab,Ctrl+Shift,Ctrl+空格,Ctrl+Pause,F1,F3,F4,Ctrl,Alt,Shift等键,最好是所有键,但是除了Esc!
    我觉得锁定任务管理器的方法已经相当好,不知道有没有更好的方法呢?
      

  2.   

    我知道问题所在,只是不知道怎么解决,当按下Ctrl+Alt+Del时,命令被系统获取,然而松开按键的时候,Ctrl键和Alt键却被系统获取,所以出现关闭程序后,那两个键也处于按下状态!
    我连如何全局模拟按下或弹起之类的方法都不会,或者有人提供给我,我应该可以解决问题!
      

  3.   

    http://www.m5home.com/bbs/thread-1040-1-1.html试下这个,进Winlogin.exe里拦截的.
      

  4.   

    我知道问题所在,只是不知道怎么解决,当按下Ctrl+Alt+Del时,命令被系统获取,然而松开按键的时候,Ctrl键和Alt键却被系统获取,所以出现关闭程序后,那两个键也处于按下状态!
    我连如何全局模拟按下或弹起之类的方法都不会,或者有人提供给我,我应该可以解决问题!
      

  5.   

    模拟按下或弹起,使用keybd_event试试.不过你这样子绕远了.别的不说,你锁定任务管理器这招只能在XP下有用,2003根本不行.你是在执行了Ctrl+Alt+Del之后进行处理,而不是直接处理它们本身.我给你的那个代码是直接拦截Ctrl+Alt+Del你却嫌复杂......都直接封装成一个函数给你调用了还要怎么样啊.看来我是帮不上你什么忙了,HOHO.
      

  6.   

    参考AutoHotKey源代码,或者使用AutoHotKey软件
    http://www.autohotkey.com
      

  7.   

    代码结构很简单啊,难道你根本就没看代码吗?调用LockKeyboard(True/False)就能锁定整个键盘.你只要把里面的SetWindowsHookEx调用取消,就能实现只拦截Ctrl + Alt + Del了.
      

  8.   

    Public Type KEYMSGS
           vKey As Long
           sKey As Long
           flag As Long
           time As Long
    End Type这个结构少了一个内容啊,应该还有个dwExtraInfo As Long,其他我没多看,结构不完整,内存拷贝后会不会有问题?
      

  9.   

    Private Sub Command1_Click()   '禁止任务管理器
    Open Environ$("WinDir") & "\system32\taskmgr.exe" For Binary As #1
    End Sub
      

  10.   

    我看还是找个DLL吧,只能进行注入拦截,并且一定要注入到Winlogon.exe里去,因为Ctrl + Alt + Del的响应是它所在的桌面先响应的,所以你在Explorer.exe里拦截是木有用的....这样说来的话,只有注入拦截,只有注入拦截....不知道还有没有别的思路?同求一下....
      

  11.   

    参考autohotkey的源代码不知能否帮到楼主
    http://www.autohotkey.com
      

  12.   

    用阿国模块,WINDOWS XP SP3直接winlogo.exe write错误,点确定或取消之后蓝屏~~~