键盘钩子在无纸化考试系统中的应用

时间:2022-10-29 10:02:57

键盘钩子在无纸化考试系统中的应用

摘要:针对无纸化考试系统中的信息拷贝问题,本文在探讨钩子的运行机制基础上,在 VC++ 6.0中利用DLL和键盘钩子实现了Ctrl+C复制功能的屏蔽。实际应用表明,该方法对防止拷贝信息是有效的。

关键词:DLL;键盘钩子;VC;Ctrl+C

中图分类号:TP316.7 文献标识码:A文章编号:1009-3044(2007)04-11176-02

1 引言

随着计算机技术的发展及计算机的日益普及,无纸化考试与无纸化办公一样已成为大势所趋。计算机辅助考试使老师将主要精力转移到如何利用现代化的科技手段提高教学效率等具有创造性的教学改革工作中。目前许多考试都采用机试。在机试的过程中,为了防止学生拷贝信息,那么就要屏蔽Ctrl+C和鼠标右键复制功能。在VC++6.0中可以使用键盘钩子和鼠标钩子实现对Ctrl+C和鼠标右键等的屏蔽。

2 钩子

钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递[1]。

钩子分类 :

(1)WH_CALLWNDPROC和WH_CALLWNDPROCRET使你可以监视发送到窗口过程的消息

(2)WH_DEBUG调试钩子

(3)WH_FOREGROUNDIDLE当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDL

(4)WH_JOURNALRECORD监视和记录输入事件

(5)WH_JOURNALPLAYBACK回放用WH_JOURNALRECORD记录事件

(6)WH_KEYBOARD 键盘钩子

(7)WH_KEYBOARD_LL低层键盘钩子

(8)WH_MOUSE鼠标钩子

(9)WH_MOUSE_LL底层鼠标钩子

(10)WH_SHELL 外壳钩子

(11)WH_MSGFILTER 和 WH_SYSMSGFILTER 使我们可以监视菜单,滚动条,消息框等。

对每种类型的钩子由系统来维护一个钩子链,最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的钩子先获得控制权。其中,全局钩子函数必须含在DLL中,而线程专用钩子还可以包含在执行文件中[2-4]。

3 实现方法

3.1 安装钩子函数

HHOOK SetWindowsHookEx(

int idHook,// hook type

HOOKPROC lpfn, // hook procedure

HINSTANCE hMod,// handle to application instance

DWORD dwThreadId // thread identifier);

idHook的取值决定Hook要截获消息的类型(如系统消息、键盘消息、鼠标消息或所有消息)和截获方式(如到达目的程序之前还是目的程序处理之后),主:WH_CALLWNDPROC, WH_CALLWNDPROCRET,WH_GETMESSAGE,WH_JOURNALRECORD,WH_KEYBOARD,WH_MOUSE,WH_SHELL。由于本程序要实现键盘钩子功能,所以选用WH_KEYBOARD。Windows发出的消息如符合钩子函数的条件就调用设置的钩子函数(地址为lpfn),钩子函数由用户定义,其接口格式必须为:

LRESULT CALLBACK KeyboardProc(

int code,// hook code

WPARAM wParam,// virtual-key code

LPARAM lParam // keystroke-message information);

其中参数wParam,lParam因钩子的类型不同有不同含义。参数code

SetWindowsHookEx函数多数情况下在DLL中,所以hMod通常为

HMODULE GetModuleHandle(

LPCTSTR lpModuleName // module name);

dwThreadId如为0,则为系统钩子,监视所有线程。

3.2 卸载钩子函数

安装上钩子函数会降低系统性能,用完后应调用卸载钩子函数

BOOL UnhookWindowsHookEx(

HHOOK hhk // handle to hook procedure);

以释放系统资源。Hhk 是安装的钩子句柄。

4 键盘钩子在无纸化考试中的应用

在无纸化考试系统中,为了防止学生拷贝信息,需要安装一个系统钩子监视所有进程。信息的拷贝,可以通过CTRL+C组合键,也可以通过右键菜单。屏蔽CTRL+C组合键的使用,要安装一个键盘钩子;屏蔽右键菜单,那么就要监视鼠标事件,鼠标钩子可以完成此功能。下面就利用键盘钩子屏蔽CTRL+C复制功能的方法加以论述。

以下程序在VC++6.0中编译通过。步骤如下:

如果Hook在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。所以采用在DLL中实现Hook。

新建一个Win32 Dynamic-Link Library工程,以下代码加入源文件中:

#include

HHOOK g_Keyboard=NULL; //用以保存设置的钩子句柄

HWND g_hWnd=NULL; //MessageBox要用到窗口句柄,

//设置一个全局的窗口句柄变量,当调用sethook(HWND hwnd)函数时

//窗口句柄就可以通过参数传进来。

新建一个基于对话框的应用程序,工程名字为HookDLG。在HookDLG.cpp文件中加入以下代码:

_declspec(dllimport) void sethook(HWND hwnd);

声明sethook(HWND hwnd);为DLL中导出的函数。

在BOOL CHookDlg::OnInitDialog() 成员函数中就可以调用

sethook(m_hWnd);

开始监控键盘。

5 结语

动态连接库、钩子函数是Windows编程中要经常用到的重要技术,特别是系统钩子,利用它可以对Windows系统消息进行拦截、监视和处理。通过本文所介绍的方法,可以屏蔽Ctrl+C组合键的使用。该方法在一些考试系统中得到应用,并证明是有效的。参照此方法,可以方便的做一个鼠标钩子,屏蔽鼠标右键功能。

参考文献:

[1]申晓龙,许文雨,谭献海. Windows钩子技术的研究与应用[J].成都信息工学院学报,2005, 20(4):380-384.

[2]杨宏宇.Hook类型选型[J].计算机应用.2003,23(5): 118-122.

[3]潘爱民.C++Primer[M].北京:中国电力出版社,2000.

[4]张力.VisualC++高级编程[M]. 北京:人民邮电出版社, 2002.

本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

上一篇:TI C6000DSP上TCP/IP协议栈的实现 下一篇:文件关联鲜为人知的