关于用键盘钩子屏蔽系统热键

libaisongtuye 2007-08-30 03:16:37
这两天在做一个开机启动界面,要求界面启动的时候,需要把系统功能键全都屏蔽掉,如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菜鸟,多谢多谢!!
...全文
471 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
footway 2007-10-29
  • 打赏
  • 举报
回复
你用的浏览器是IE, firefox, 还是其他的, 怎么会结不了呢?
问题是怎么解决,能告知下么?
footway 2007-10-29
  • 打赏
  • 举报
回复
你用的浏览器是IE, firefox, 还是其他的, 怎么会结不了呢?
问题是怎么解决,能告知下么?
libaisongtuye 2007-09-12
  • 打赏
  • 举报
回复
网页一直有错误,结不了了,郁闷
libaisongtuye 2007-09-06
  • 打赏
  • 举报
回复
为什么我点给分没反应?
libaisongtuye 2007-09-06
  • 打赏
  • 举报
回复
问题已经解决了,但具体怎么弄的,我自己也搞不清楚,是那种知其然,不知其所以然的状态
这几天太忙了,连结贴都忘了,谢谢各位热心帮忙!
kugou123 2007-09-03
  • 打赏
  • 举报
回复
拦截Win键,可以用低级键盘钩子
linuxpgy 2007-09-03
  • 打赏
  • 举报
回复
系统键拦不住,其他键可以~
Yofoo 2007-09-02
  • 打赏
  • 举报
回复
试试低级键盘钩子 WH_KEYBOARD_LL, 系统键普通的Hook好像没用的
plzy86 2007-09-02
  • 打赏
  • 举报
回复
这里还有一个HOOK链的先后顺序吧,你能保证你在系统菜单的HOOK前先转入了你的HOOK过程?

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧