//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事件中。程序在退出时必须删除图标。
……