2009-3-27 13:26

WINDOWS下键盘挂钩监控函数的应用技术

目前标准的104 键盘上都有两个特殊的按键,其上分别用WINDOW程序徽标和鼠标下 拉列表标识,本文暂且分别称为Micro左键和Micro右键,前者用来模拟鼠标左键激 活开始菜单,后者用来模拟鼠标右键激活属性菜单。这两个特殊按键只有在按下后 立即抬起即完成 CLICK过程才能实现其功能,并且没有和其它按键进行组合使用。 由于WINDOWS 系统中将按键划分得更加详细,使应用程序中很难灵活定义自己的专 用快捷键,中国自学编程网,www.zxbc.cn 。比如在开发.IME等应用程序时很难找到不与WORD8.0等其它应用程序冲突 的功能按键。如果将标准104键盘中的这两个特殊按键作为模拟CTRL和ALT 等专用按 键,使其和其它按键组合,就可以在自己的应用程序中自由地设置专用功能键,为 应用程序实现各种功能快捷键提供灵活性。正常情况下WINDOWS 键盘事件驱动程序 并不将这两个按键的消息进行正常解释,这就必须利用键盘事件的挂钩监控函数来 实现其特定的功能。其方法如下:

1、首先编制如下一个简单动态链接库程序,并编译成DLL文件。 #include \"windows.h\"
int FAR PASCAL LibMain(HANDLE hModule,UINT wDataSeg, UINT cbHeapSize,LPSTR lpszCmdLine);
int WINAPI WEP(int bSystemExit);
int WINAPI InitHooksDll(HWND hwndMainWindow);
int WINAPI InstallFilter(BOOL nCode);
LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam);
static HANDLE hInstance; // 全局句柄
static HWND hWndMain; // 主窗口句柄
static int InitCalled=0; // 初始化标志
static HHOOK hKeyHook;
FARPROC lpfnKeyHook=(FARPROC)KeyHook;
BOOL HookStates=FALSE;
int FAR PASCAL LibMain( HANDLE hModule, UINT wDataSeg, UINT cbHeapSize, LPSTR lpszCmdLine)
{
if (cbHeapSize!=0)
UnlockData(0);
hInstance = hModule;
return 1;
}
int WINAPI WEP (int bSystemExit)
{ return 1;}
int WINAPI InitHooksDll(HWND hwndMainWindow)
{
hWndMain = hwndMainWindow;
InitCalled = 1;
return (0);
}

int WINAPI InstallFilter(BOOL nCode)
{ if (InitCalled==0)
return (-1);
if (nCode==TRUE)
{
hKeyHook=SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)lpfnKeyHook,hInstance,0);
HookStates=TRUE;
}
else
{
UnhookWindowsHookEx(hKeyHook);
HookStates=FALSE;
}
return(0);
}

 

LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam)
{
static BOOL msflag=FALSE;
if(nCode>=0)
{
if(HookStates==TRUE)
{
if((wParam==0xff)|| //WIN3.X下按键值
(wParam==0x5b)||(wParam==0x5c)){//WIN95下按键值
if((i==0x15b)||(i==0x15c)){ //按键按下处理
msflag=TRUE;
PostMessage(hWndMain,0x7fff,0x1,0x3L);
}
else if((i==0xc15b)||(i==0xc15c)){//按键抬起处理 msflag=FALSE;
PostMessage(hWndMain,0x7fff,0x2,0x3L);
}
}
}
}
return((int)CallNextHookEx
(hKeyHook,nCode,wParam,lParam));
}
该程序的主要功能是监控键盘按键消息,将两个特殊按键Micro按下和抬起消息转换 成自定义类型的消息,并将自定义消息发送给应用程序主窗口函数。

2、在应用程序主函数中建立窗口后,调用InitHooksDll()函数来初始化动态链接 库,并将应用程序主窗口句柄传递给链接库,然后调用InstallFilter()函数挂接键 盘事件监控回调函数。
InitHooksDll(hIMEWnd); //初始化DLL
InstallFilter(TRUE); //安装键盘回调函数

3、在应用程序主窗口函数处理自定义消息时,保存Micro按键的状态,供组合按键 处理时判断使用。
switch (iMessage)
{
case 0x7fff: //自定义消息类型 [Page]
if(lParam==0x3L)
{//设置Micro键的状态
if(wParam==0x1)
MicroFlag=TRUE;
else if(wParam==0x2)
MicroFlag=FALSE;
}
break;

4、在进行按键组合处理时,首先判断Micro键是否按下,然后再进行其它按键的判 断处理。
case WM_KEYDOWN: // 按键按下处理
if(MicroFlag==TRUE)
{
//Micro键按下
if((BYTE)HIBYTE(wParam)==0x5b)
{
//Micro+\"[\"组合键 ......//按键功能处理 }
else if((BYTE)HIBYTE(wParam)==0x5d)
{
//Micro+\"]\"组合键 ......//按键功能处理 } } break;

5、当应用程序退出时应注意下载键盘监控函数,即调用InstallFilter(FALSE)函 数一次。

6、利用本文提供的方法设置自己的应用程序功能按键,在保证程序功能按键不会 与其它系统发生冲突的同时,有效地利用了系统中现有资源,而且在实现应用程序 功能的同时灵活应用了系统中提供的各种功能调用。 

 

来源:中国自学编程网

相关

本评论 更新于:2025-12-15 0:08:39
在C114 APP中与业内人士畅聊通信行业热点话题!