首页/技术开发/内容

Windows2000平台下混合编程屏蔽键盘事件

技术开发2023-12-17 阅读()
//Ctrl+Space

(((GetKeyState(VK_CONTROL) & 0x8000) != 0) && ((GetKeyState(VK_SHIFT) & 0x8000) != 0));

break;

}

}

return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam,

lParam));

}




这个函数负责根据客户端调用参数,向系统注册、注销HOOK。HOOK必须在不要的时候卸载!

//HWND hWnd:客户端程序调用窗体的句柄,bool nCode:挂还是不挂HOOK的标志,bool bWhich:挂哪个HOOK的标志

char _stdcall ActivateKey(HWND hWnd,bool nCode,bool bWhich)

{

if (bWhich)

{

if(nCode) // 安放底层HOOK

{

hProcWnd=hWnd;//记录下这一个DLL是由哪个窗体调用的

hOldHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)ShieldKeyProc,hInstance,0); //记录下上一个DLL是由哪个窗体调用的

return(hOldHook != NULL? 1: 0 );

}

else // 卸下HOOK

UnhookWindowsHookEx(hOldHook);

}

else

{

if(nCode) // 安放HotHooK

{

hProcWnd=hWnd;//记录下这一个DLL是由哪个窗体调用的

hOldHook2=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)HotKeyProc,hInstance,0); //记录下上一个DLL是由哪个窗体调用的

return(hOldHook2 !=NULL ? 1: 0);

}

else // 卸下HOOK

UnhookWindowsHookEx(hOldHook2);

}

return true;




III. 以Release方式编译保存。

IV. 关于DLL调试可以参见有关文档。



3) 客户端程序

微软的 Visual Basic 因为其编写Windows界面程序的方便、灵活而成为我们开发客户端程序的首选。我们采用Visual Basic 6.0 中文企业版(以下简称VB)进行开发。VB本身并不直接支持DLL文件的开发,但提供了对DLL的调用功能。作为客户端程序,就是实现用户操作与程序调用DLL,API函数的转换。下面介绍简要步骤:



I. 工程建立

新建三个窗体.分别命名为:Form1,frmLogin,Dialog.
Form1作为主窗体界面布置如图<1>:

<1>

第一项采用API函数屏蔽任务栏;

第二项通过操作注册表,实现屏蔽Ctrl+Alt+Del组合键;

第三项通过调用开发的底层键盘HOOK DLL实现功能键的屏蔽。

密码设置项用于客户端程序激活需要密码情况。

frmLogin作为用户设置密码后,重新激活的登录窗体,如图<2>:

<2>

Dialog则作为”密码设置”窗体,如图<3>:

<3>



II. 代码流程:

本文给出主流程图。
说明:

i. 因为软件是基于Windows2000平台,所以启动后首先要判断系统平台;

ii. 考虑系统安全性,程序要检查是否已有远行实例;

iii. 因为要接受DLL文件发送的激活消息,所以可以在窗体加载事件中通过SetWindowLong函数在VB消息序列中添加自定义消息过滤函数。



SetWindowLong语法:

SetWindowLong (hwnd, GWL_WNDPROC, AddressOf SysMenuProc)
hwnd:当前窗体的句柄

GWL_WNDPROC:设置一个新的窗口消息处理过程的地址

AddressOf SysMenuProc :取新的窗口消息处理过程名称

返回值代表前个窗体消息处理过程。



SysMenuProc 函数是个回调函数。必须声明定义在标准模块中。

iv. 程序最小化在系统托盘区编程利用Shell_NotifyIcon函数。

Shell_NotifyIcon语法可以参见微软的MSDN。添加系统托盘图标子程序放在窗体的Resize事件中。程序在退出时必须删除图标。



第1页  第2页  第3页  第4页  第5页  第6页  第7页  第8页  第9页  第10页  第11页 

……

相关阅读