以下是我写的一个禁止键盘的dll。问题是该挂钩只能对一般的键起作用。而对
left windows(窗口键,按键后出现开始菜单)不起作用。这是为什么?
小弟打魔兽时想按alt却老是按倒left windows郁闷,想把它禁掉。
请高手指教#include "windows.h"#pragma data_seg("mydata")
HHOOK hhkHook = NULL; //定义钩子句柄
HINSTANCE hInstance = NULL; //dll的实例句柄
HWND hWndMain = NULL; //主窗口句柄
#pragma data_seg()LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
hInstance=(HINSTANCE)hModule; //得到DLL实例
return TRUE;
}BOOL WINAPI enableHook(HWND hWnd) {
hWndMain = hWnd;
hhkHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0);
return true;
}BOOL WINAPI disableHook() {
return UnhookWindowsHookEx(hhkHook);
}LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam) {
return 1;//没有传递消息下去。
}

解决方案 »

  1.   

    这个是有希望的。VirtualPC不就是钩了嘛。
      

  2.   

    看看以下这段程序
    只要它运行着,就可以满足你的要求
    /*
      kbhook.cpp
    */#define _WIN32_WINNT    0x400
    #define STRICT
    #define WIN32_LEAN_AND_MEAN
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>DWORD   g_main_tid  = 0;
    HHOOK   g_kb_hook   = 0;
    BOOL CALLBACK con_handler (DWORD)
        {
            PostThreadMessage (g_main_tid, WM_QUIT, 0, 0);
            return TRUE;
        };
    LRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM l)
        {
            PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)l;
            const char *info = NULL;
            if (p->vkCode == VK_LWIN)
                return 1;
            //  always call next hook
            return CallNextHookEx (g_kb_hook, code, w, l);
        };int main (void)
        {
            g_main_tid = GetCurrentThreadId ();
            SetConsoleCtrlHandler (&con_handler, TRUE);        g_kb_hook = SetWindowsHookEx (
                WH_KEYBOARD_LL, 
                &kb_proc, 
                GetModuleHandle (NULL), // 不能为NULL,否则失败
                0);        if (g_kb_hook == NULL)
            {
                fprintf (stderr, 
                    "SetWindowsHookEx failed with error %d\n",
                    ::GetLastError ());
                return 0;
            };        //  消息循环是必须的,想知道原因可以查msdn        MSG msg;
            while (GetMessage (&msg, NULL, 0, 0))
            {
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            };
            UnhookWindowsHookEx (g_kb_hook);
            return 0;
        };
      

  3.   

    是不是WIN键只能用低级键盘钩子才能钩上啊?用普通的键盘钩子怎么不行?我试过用普通的键盘钩子对左边的WIN键挂钩,结果不成功。
      

  4.   

    我觉得这样做了,还是不能对ALT+CTRL+DEL使它挂起。
      

  5.   

    WH_KEYBOARD
    不可以钩系统键
      

  6.   

    我查资料是这么说的 :
    WH_KEYBOARD:当应用程序调用函数GetMessage或者PeekMessage并且出现键盘事件WM_KEYUP或者WM_KEYDOWN需要处理时,windows就调用WH_KEYBOARD的过滤函数。看见了吗?只处理WM_KEYUP或者WM_KEYDOWN而不处理WM_SYSKEYDOWN或者WM_SYSKEYUP,那么你的alt是系统键的功能键只能接收到WM_SYSKEYDOWN和WM_SYSKEYUP,你可以用spy++试试看!!所以我上面那么说
      

  7.   

    可以用WH_GETMESSAGE钩子,然后判断消息的内容:
    switch(wParam)
    {
         case(WM_KEYDOWN):  ...  break;
         case(WM_KEYUP):  ...  break;
         case(WM_SYSKEYDOWN):  ...  break;
         case(WM_SYSKEYDUP):  ...  break;
         case(WM_CHAR):  ...  break;
         case(WM_SYSCHAR):...  break;
    ......
         default:  ... ;
    }内容自己根据要求填写吧!
         
      

  8.   

    我查过MSDN,在WH_KEYBOARD_LL的说明中表示,该键盘低级钩子是可以钩住系统键的,一般的WH_KEYBOARD钩子则不行。
      

  9.   

    要钩ctrl + alt + del只能打driver的主意
      

  10.   

    WH_KEYBOARD_LL 这个可以钩到的。~~以前写过一个把。。win键改成。esc键的程序。在vc知识库有一个钩ctl+alt+del的程序。。看看那个
      

  11.   

    那个不是用钩子,用的是gina.dll
      

  12.   

    那个我去看了一下,有些程序那上面要动态调用msgina.dll,但实际上不能调用,如它不调用那个文件,可以吗,如果要调用它,但因为它没有.lib导入文件。所以我觉得不能如那个vc学习的11章那上面所谈的那样,可以动态调用msgina.dll,请问这些问题可以如何解决。在线等。
      

  13.   

    hi!我想问你个问题,
    我在windowsxp+vc6.0下写钩子函数,
    hHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)HookProc,hInstance1,0);
    错误如下:
    F:\MyProjects\testkeyboardDLL3\testkeyboardDLL3.cpp(75) : error C2065: 'WH_KEYBOARD_LL' : undeclared identifier
    我在头文件上加了:
    #define WIN32_LEAN_AND_MEAN
    请问为什么?如果改成WH_KEYBOARD则完全没有问题。是不是系统不能识别WH_KEYBOARD_LL低级钩子?
    [email protected]