这两天在做一个开机启动界面,要求界面启动的时候,需要把系统功能键全都屏蔽掉,如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菜鸟,多谢多谢!!
在做这个需求的时候,用到了键盘钩子,编译环境在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菜鸟,多谢多谢!!
解决方案 »
- 宏定义的问题
- 谁有ffmepg编译好的库??????急需!!!!!!!
- 寻求帮助:使用CButtonST创建的按钮如何动态加载和更换图片?
- 关于创建一个开机自动启动,在后台运行的程序
- 如何写一个函数,其作用是将它的参数,在Windows窗口中显示出来
- vc++.net中怎么生成dll文件啊?
- 怎样把24位bmp转换成gif
- 100分求一个简单问题,如果判断一个给定程序(c:\tset.exe)是否运行!
- RichEdit控件保存图片问题
- 一个解任意多边形最大内接矩形的思路
- ie 调用vc6 自动生成的OCX关闭时出错? (附ADSL付费一次性交多长时间合适)
- CreateEvent后CloseHandle再OpenEvent还能得到,我纳闷了。
问题是怎么解决,能告知下么?
问题是怎么解决,能告知下么?