怎样才能把键盘给屏闭掉,就是不让键盘的某些键使用,最好是有代码,快!!!!

解决方案 »

  1.   

    VB实现不了,用VC++做了个DLL文件,给VB调用才可以
      

  2.   

    键盘钩子程序示例 
    本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyHook和动态连接库LaunchDLL。 
    1、首先编制MFC扩展动态连接库LaunchDLL.dll: 
    (1)选择MFC AppWizard(DLL)创建项目LaunchDLL;在接下来的选项中选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)。 
    (2)在LaunchDLL.h中添加宏定义和待导出函数的声明:  
    #define DllExport __declspec(dllexport) 
    …… 
    DllExport void WINAPI InstallLaunchEv(); 
    …… 
    class CLaunchDLLApp : public CWinApp 

    public: 
    CLaunchDLLApp(); 
      
    //{{AFX_VIRTUAL(CLaunchDLLApp) 
    //}}AFX_VIRTUAL 
      
    //{{AFX_MSG(CLaunchDLLApp) 
    // NOTE - the ClassWizard will add and remove member functions here. 
    // DO NOT EDIT what you see in these blocks of generated code ! 
    //}}AFX_MSG 
    DECLARE_MESSAGE_MAP() 
    }; 
    (3)在LaunchDLL.cpp中添加全局变量Hook和全局函数LauncherHook、SaveLog: 
    HHOOK Hook; 
    LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam); 
    void SaveLog(char* c); 
    (4)完成以上提到的这几个函数的实现部分: 
    …… 
    CLaunchDLLApp theApp; 
    …… 
    DllExport void WINAPI InstallLaunchEv() 

    Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD, 
    (HOOKPROC)LauncherHook, 
    theApp.m_hInstance, 
    0); 

    在此我们实现了Windows的系统钩子的安装,首先要调用SDK中的API函数SetWindowsHookEx来安装这个钩子函数,其原型是: HHOOK SetWindowsHookEx(int idHook, 
    HOOKPROC lpfn, 
    HINSTANCE hMod, 
    DWORD dwThreadId); 其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;
    第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;
    第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;
    最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息,在本程序中钩子需要为全局钩子,故设定为0。 
    …… 
    LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam) 

    LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam); 
    if(nCode==HC_ACTION) 

    if(lParam & 0x80000000) 

    char c[1]; 
    c[0]=wParam; 
    SaveLog(c); 


    return Result; 

    虽然调用CallNextHookEx()是可选的,但调用此函数的习惯是很值得推荐的;否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果,所以我们应尽量调用该函数除非绝对需要阻止其他程序获取通知。 
    …… 
    void SaveLog(char* c) 

    CTime tm=CTime::GetCurrentTime(); 
    CString name; 
    name.Format("c:\\Key_%d_%d.log",tm.GetMonth(),tm.GetDay()); 
    CFile file; 
    if(!file.Open(name,CFile::modeReadWrite)) 

    file.Open(name,CFile::modeCreate|CFile::modeReadWrite); 

    file.SeekToEnd(); 
    file.Write(c,1); 
    file.Close(); 

    当有键弹起的时候就通过此函数将刚弹起的键保存到记录文件中从而实现对键盘进行监控记录的目的。 
    编译完成便可得到运行时所需的键盘钩子的动态连接库LaunchDLL.dll和进行静态链接时用到的LaunchDLL.lib。 2、下面开始编写调用此动态连接库的主程序,并实现最后的集成: 
    (1)用MFC的AppWizard(EXE)创建项目KeyHook; 
    (2)选择单文档,其余几步可均为确省;  
    (3)把LaunchDLL.h和LaunchDLL.lib复制到KeyHook工程目录中,LaunchDLL.dll复制到Debug目录下。 
    (4)链接DLL库,即在"Project","Settings…"的"Link"属性页内,在"Object/librarymodules:"中填入"LaunchDLL.lib"。再通过"Project","Add To Project","Files…"将LaunchDLL.h添加到工程中来,最后在视类的源文件KeyHook.cpp中加入对其的引用: 
    #include "LaunchDLL.h" 
    这样我们就可以象使用本工程内的 函数一样使用动态连接库LaunchDLL.dll中的所有导出函数了。 
    (5)在视类中添加虚函数OnInitialUpdate(),并添加代码完成对键盘钩子的安装: 
    …… 
    InstallLaunchEv(); 
    …… 
    (6)到此为止其实已经完成了所有的功能,但作为一个后台监控软件,运行时并不希望有界面,可以在应用程序类CkeyHookApp的InitInstance()函数中将m_pMainWnd->ShowWindow(SW_SHOW);改为m_pMainWnd->ShowWindow(SW_HIDE);即可。 
    四、运行与检测 
    编译运行程序,运行起来之后并无什么现象,但通过Alt+Ctrl+Del在关闭程序对话框内可以找到我们刚编写完毕的程序"KeyHook",随便在什么程序中通过键盘输入字符,然后打开记录文件,我们会发现:通过键盘钩子,我们刚才输入的字符都被记录到记录文件中了。 
    小结:系统钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows系统消息进行拦截、监视、处理。这种技术广泛应用于各种自动监控系统中。 -----------------------------------------------------------------------
    全局的底层键盘钩子,实现屏蔽一对win键,一对ctrl键,一对shift键,一对alt键。下面是.dll的源代码,是用VC做的。//.cpp#include "windows.h"#define WH_KEYBOARD_LL     13typedef struct tagKBDLLHOOKSTRUCT {
        DWORD   vkCode;
        DWORD   scanCode;
        DWORD   flags;
        DWORD   time;
        DWORD   dwExtraInfo;
    } KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;HHOOK hHook = NULL;
    HINSTANCE hInstance = NULL;void WINAPI StartHook();
    void WINAPI StopHook();
    LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);BOOL APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
    hInstance = (HINSTANCE)hModule;
        return TRUE;
    }LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    if (nCode >= 0)
    {
    KBDLLHOOKSTRUCT* kb = (KBDLLHOOKSTRUCT*)lParam;
    bool exp = kb->vkCode == 91 || kb->vkCode == 92 || kb->vkCode >= 160 && kb->vkCode <= 165;
    if (exp) return TRUE;
    }
    return CallNextHookEx(hHook, nCode, wParam, lParam);
    }void WINAPI StartHook()
    {
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);

    }void WINAPI StopHook()
    {
    UnhookWindowsHookEx(hHook);
    }//.defEXPORTS
    StartHook @1
    StopHook @2
    编译后与VB的工程文件放在同一目录中。
      

  3.   

    下面是VB的调用部分,非常简单,像用普通的API一样。' 加两个CommandButton。
    Option Explicit
    Private Declare Sub StartHook Lib "MaskKey.dll" ()
    Private Declare Sub StopHook Lib "MaskKey.dll" ()Private Sub Command1_Click()
        StartHook
    End SubPrivate Sub Command2_Click()
        StopHook
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        StopHook
    End Sub--------------------------------------------------------------------
    Win2K/NT/XP环境下
    add a checkbox named chkDisable.caption="&Disable ALT-TAB, ALT-ESC, CTRL-ESC,LWin,RWin,Win+Any"
    to a new from named frmMain.frm in new project hook_kb_LL.vbp
    add code below:Option ExplicitDim hhkLowLevelKybd As LongPrivate Sub chkDisable_Click()
    If chkDisable = vbChecked Then
        hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
    Else
        UnhookWindowsHookEx hhkLowLevelKybd
        hhkLowLevelKybd = 0
    End If
    End SubPrivate Sub Form_Unload(Cancel As Integer)
    If hhkLowLevelKybd <> 0 Then UnhookWindowsHookEx hhkLowLevelKybd
    End Subin new module named modDisableLowLevelKeys.bas
    code below:
    Option ExplicitPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As IntegerPublic Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As LongPublic Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As LongPublic Const HC_ACTION = 0
    Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101
    Public Const WM_SYSKEYDOWN = &H104
    Public Const WM_SYSKEYUP = &H105
    Public Const VK_TAB = &H9
    Public Const VK_CONTROL = &H11
    Public Const VK_ESCAPE = &H1BPublic Const WH_KEYBOARD_LL = 13
    Public Const LLKHF_ALTDOWN = &H20Public Type KBDLLHOOKSTRUCT
        vkCode As Long
        scanCode As Long
        flags As Long
        time As Long
        dwExtraInfo As Long
    End TypeDim p As KBDLLHOOKSTRUCTPublic 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)
             fEatKeystroke = _
                ((p.vkCode = VK_TAB) And ((p.flags And LLKHF_ALTDOWN) <> 0)) Or _
                ((p.vkCode = VK_ESCAPE) And ((p.flags And LLKHF_ALTDOWN) <> 0)) Or _
                ((p.vkCode = VK_ESCAPE) And ((GetKeyState(VK_CONTROL) And &H8000) <> 0)) Or _
                ((p.vkCode = 91) Or (p.vkCode = 92) Or (p.vkCode = 93)) '左右Win 和徽标键
           End If
        End If
        
        If fEatKeystroke Then
            LowLevelKeyboardProc = -1
        Else
            LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
        End If
    End Function
      

  4.   

    可以将键盘鼠标都屏蔽,单针对键盘就不知道了:
    Private Declare Function BlockInput Lib "user32" (ByVal fBlock As Long) As Long
    BlockInput true  '屏蔽
    BlockInput false '取消屏蔽