这两天在做一个开机启动界面,要求界面启动的时候,需要把系统功能键全都屏蔽掉,如Win、Alt、Ctrl等,还有系统组合键Win+D等,
在做这个需求的时候,用到了键盘钩子,编译环境在VC6.0,创建新的DLL工作间,手工加的.cpp和.h文件,没有其他别的文件.cpp文件源码:
--------------------------------------------------------------------------
#include "stdafx.h"
#include "KBLock.h"
HHOOK hhkHook=NULL;                            //定义钩子句柄
HINSTANCE hInstance=NULL;                  //程序实例//下面的DLLMain相当于Win32程序中的WinMain函数,是入口点
BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
hInstance=(HINSTANCE)hModule;          //得到DLL实例
 return TRUE;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
//这是处理键盘消息的主要函数,在其中进行禁止操作LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
/*
if( (wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100) )
{
   //::MessageBox(NULL,(const char *)nCode,"Hello",MB_OK);
::MessageBox(0,"测试","Hello",MB_OK);
return 1;
}
*/
       if (nCode < 0 )
      {
              //return CallNextHookEx(hhkHook,nCode,wParam,lParam);
   //return -1;
 }
if (nCode != HC_ACTION)
{
              //return CallNextHookEx(hhkHook,nCode,wParam,lParam);}
//return 1;
//给出提示:键盘已经被锁定,要进行判断,看是否已有提示窗口,否则会弹个没完
if (!::FindWindow(0, "KeyBoard Locked"))
{ ::MessageBox(0,"键盘已经锁定!!!","KeyBoard Locked",MB_OK);
}return 1;   //没有return CallNextHookEx(hhkHook,nCode,wParam,lParam)则不会把消息//传递下去,所以我们的键盘就不起作用了
}///////////////////////////////////////////////////////////////////////////////////////////////////////
// This is an example of an exported variable//导出函数:启动键盘锁定
BOOL EnableKeyboardCapture()
{
       if(!(hhkHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0)))
              return FALSE;
       return TRUE;
}
//导出函数:解除键盘锁定
BOOL DisableKeyboardCapture()
 {
        return UnhookWindowsHookEx(hhkHook);
 }
---------------------------------------------------------------------------
这段代码生成的DLL文件没有问题,我在C#中引用了这个DLL,然后用 EnableKeyboardCapture();  调用的时候,能弹出“键盘已经锁定!!!”的字样
然后我就用被屏蔽的这段
/*
if( (wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100) )
{
   //::MessageBox(NULL,(const char *)nCode,"Hello",MB_OK);
::MessageBox(0,"测试","Hello",MB_OK);
return 1;
}
*/
想要实现,按下某个或某些系统键的时候,可以拦截下消息,不让消息继续传递下去,网上的其他代码里都是用return 1;就可以,可我的一直都不行,
我加了return 1的时候,是返回了,但是系统键的功能没有被拦截下来,就是说在按下Win键的时候,能弹出“测试”字样的对话框,然后结束,可以开始菜单却跟没有任何拦截一样,显示出来了,这让我很郁闷,在网上找的时候,都是通过引用HOOK,然后执行SetWindowsHookEx,在SetWindowsHookEx里,如果不想让消息继续传递下去的话,就不引用CallNextHookEx,而直接return 1就行了,可我的怎么试都是不行,高手给指点下,可能是什么原因,最好有参考代码,本人VC菜鸟,多谢多谢!!

解决方案 »

  1.   

    这里还有一个HOOK链的先后顺序吧,你能保证你在系统菜单的HOOK前先转入了你的HOOK过程?
      

  2.   

    试试低级键盘钩子 WH_KEYBOARD_LL, 系统键普通的Hook好像没用的
      

  3.   

    拦截Win键,可以用低级键盘钩子
      

  4.   

    你用的浏览器是IE, firefox, 还是其他的, 怎么会结不了呢?
    问题是怎么解决,能告知下么?
      

  5.   

    你用的浏览器是IE, firefox, 还是其他的, 怎么会结不了呢?
    问题是怎么解决,能告知下么?