无纸化考试系统防止考生作弊的实现措施.doc_第1页
无纸化考试系统防止考生作弊的实现措施.doc_第2页
无纸化考试系统防止考生作弊的实现措施.doc_第3页
无纸化考试系统防止考生作弊的实现措施.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

无纸化考试系统防止考生作弊的实现措施田民格(三明学院 数学与计算机科学系,福建 三明 365004)摘要:无纸化考试系统防止考生作弊是无纸化考试系统要解决的首要问题。本文介绍了无纸化考试系统考生可用的作弊手段和防止考生作弊的具体方法,用API调用技术、注册表技术、拦截消息技术、回调技术、钩子技术实现了这些方法并给出详细的Delphi实现代码。关键词:无纸化考试系统; 作弊; 消息; 回调; 钩子中图分类号:TP316文献标识码:A文章编号:1673-4343(2007)04-0456-04The Solution to Prevent Examinee from Cheating of Paperless Examination SystemTian Min-ge(Math and Computer Science Department,Sanming College,Sanming 365004,China)Abstract:Prevent examinee from cheating is one of chief problems to solve of no paper examination system.This paper introduces the measure of how to practising fraud for examinee and the solution to prevent examinee from practising fraud.Then,introduces the solution by using the technology of calling API,registry,heading off of the messages transferred to window by Windows,callback,lowlevel keyboard hook in detail with Delphi.Key words:No Paper Examination System; Practising fraud; Message; Callback; hook无纸化考试防止考生作弊是无纸化考试系统要解决的一个很重要的问题12,也是到目前为止国内多数著名无纸化考试系统尚未能完全解决的难题(笔者从事无纸化考试系统软件开发8年有余,见过考试系统几十个,如新为、永道、杰佛、无忧等软件公司的考试系统,都尚未完全解决此难题)。因为Windows是一个多任务的操作系统,在任一时刻都允许运行多个程序,同样,在无纸化考试过程中,要作弊的考生必然会通过各种途径(如Ctrl+Alt+Del)切换到其它应用程序并搜索到与考试相关的信息,使考试系统变成了“拷贝”系统,为此,如何使多任务的操作系统暂时失去多任务的功能(屏蔽Ctrl+Alt+Del热键等问题)是解决防止考生作弊的关键。本文使用Delphi综合应用了API调用技术、注册表技术、拦截消息技术、回调技术、钩子技术3等很好地实现了三层C/S模式4下的无纸化考试系统5中防止考生作弊问题。若采用B/S模式,则更难解决这些问题,且存在考题很难兼容Word格式等问题。1 考试系统中防止考生作弊的问题与原理考试系统中要防止考生作弊,按难度的不同,依次要解决四个方面的问题,即窗体的控制问题、任务栏的控制问题、热键的屏蔽问题、某些应用程序的智能提示信息。1.1 窗体的控制问题最简单的作弊手段就是直接通过键盘或鼠标切换到其它应用程序查看答案。这是多数无纸化考试系统都能解决的问题,就是将答题窗体最大化并保持在所有窗体的最上面,包括盖住任务栏,且窗体没有最小化和还原按钮,这样,考生即使切换到其它窗体,也被答题窗体盖住而无法看到答案。但Delphi顶层技术存在一个漏洞,Delphi窗体在最大化时可用鼠标拖动标题栏移动窗体,而Delphi窗体没有禁止窗体移动的属性可用。解决的办法是拦截窗体感应消息WM_NCHITTEST和窗体位置改变消息WM_WindowPosChanging,前者将标题栏消息调包成窗体客户区消息,后者将窗体新坐标位置改变回成原坐标值,这样,无论考生通过何手段都无法移动窗体了。通过拦截消息技术考生一般是无法移动窗体,包括控制菜单的移动命令也无法移动窗体,但考虑到控制菜单是操作系统提供的功能,为防某些操作系统绕过以上消息,作为安全的冗余技术,增加拦截窗体系统命令WM_SysCommand消息,若命令类型是移动窗体SC_MOVE或改变窗体大小SC_SIZE则将二命令丢弃即可防止考生通过控制菜单移动窗体。1.2 任务栏的控制问题答题窗体完全控制后,任务栏也是必须控制重要部分。没有经过全面的测试,一般很难发现这一问题,因此笔者所见过的所有考试系统都忽视了这一问题。在XP操作系统中,只要运行某些程序或答题窗体弹出消息框时(如考生单击退出考试按钮或菜单弹出确认消息框时),答题窗体将不能保持在所有窗体的最上面,任务栏会定时刷新并浮于答题窗体的上面,考生只要将鼠标右击任务栏就可以将所有窗体最小化,然后就可以切换到其它窗体。解决的办法是调用操作系统API函数隐藏任务栏并使之无效(Disable)变灰色,这样即使任务栏显示了也不会响应鼠标事件。1.3 热键的屏蔽问题屏蔽系统热键是目前多数著名的考试系统都尚未能完全解决的难题,如Win+D或Win+M可将所有窗体最小化并切换到桌面。解决的办法是用低级键盘钩子屏蔽所有系统热键,包括Win+D、Win+M、Alt+Tab、Alt+Esc、Ctrl+Esc等组合键和功能键。但组合键Ctrl+Alt+Del却无法屏蔽,最后用注册表技术屏蔽任务管理器。1.4 屏蔽某些应用程序的智能提示信息防止考生作弊的第四方面就是屏蔽某些应用程序的智能提示信息。象金山词霸就有这样的功能,这在双语考试中是不允许的。解决的办法是用回调技术搜索所有进程,将找到的进程中标题含有“金山词霸”的进程关闭。这样,考生无法通过U盘、光盘等存储介质浏览答案,也无法通过网络搜索答案了。2 窗体的控制问题2.1 最大化窗体并保持在所有窗体顶层6在窗体创建或显示时通过设置窗体的相关属性使窗体最大化并保持在所有窗体的顶层,且不允许标题栏显示最小化和还原按钮,具体如下如下。WindowState:=wsMaximized;FormStyle:=fsStayOnTop;BorderIcons:=biSystemMenu;2.2 禁止窗体移动在窗体类中分别添加要拦截的窗体感应消息WM_NCHITTEST、窗体位置改变消息WM_WindowPosChanging、窗体系统命令消息WM_SysCommand及其相应的消息处理程序的原型说明,具体如下。procedure WMNCHitTest(var Msg: TMessage);message WM_NCHITTEST;procedure onPosChange(var msg:TWMWindowPosChanging);message wm_WindowPosChanging;procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SysCommand;然后添加以上三个消息处理程序的具体实现代码如下。procedure TForm3.WMNCHitTest(var Msg: TMessage);Begin/拦截标题栏消息inherited;if (Msg.Result=2)or(Msg.Result=100) then Msg.Result:=1;End;procedure TForm3.WMSysCommand(var Msg:TWMSysCommand);Begin/屏蔽系统菜单移动命令和大小命令if (msg.CmdType=SC_MOVE)or(msg.CmdType=SC_SIZE) then exit;inherited;End;procedure TForm3.onPosChange(var msg:TWMWindowPosChanging);begin/拦截移动消息msg.windowpos.x:=left;msg.windowpos.y:=top;msg.result:=0;end;3 任务栏的控制问题要隐藏任务栏并使之无效变灰色,首先获得任务栏窗体及其各区域子窗体的句柄,然后使任务栏窗体及其各区域子窗体无效且隐藏。通过调用API函数FindWindow获得任务栏窗体的句柄,通过调用API函数FindWindowEx获得任务栏各区域子窗体的句柄,具体代码如下。procedure GetHandles(var W:TrayWnd);begin/得到Tray Bar窗体句柄w0:=FindWindow(Shell_TrayWnd,nil);/得到开始按钮子窗体句柄w1:=FindWindowEx(w0,0,Button,nil);/得到应用程序切换区子窗体句柄w2:=FindWindowEx(w0,0,ReBarWindow32,nil);/得到任务栏通知区子窗体句柄w3:=FindWindowEx(w0, 0,TrayNotifyWnd,nil);/得到任务栏时钟子窗体句柄w4:=FindWindowEx(w0,0,TrayNotifyWnd,nil);w4:=FindWindowEx(w4,0,TrayClockWClass,nil);end;通过调用API函数EnableWindow使任务栏窗体及各区域子窗体无效,通过调用API函数ShowWindow使任务栏窗体及各区域子窗体隐藏,具体代码如下。procedure TrayShowEnable(W:TrayWnd;H:boolean=false);Var i:Integer;begin for i:=0 to 4 do beginEnableWindow(wi,H);ShowWindow(wi,IfThen(H,SW_SHOW,SW_HIDE); end;end;4 热键的屏蔽问题要屏蔽各种热键,首先定义按键消息结构和相关变量。typetagKBDLLHOOKSTRUCT=packed record vkCode:DWORD;/虚拟键值 scanCode:DWORD;/扫描码值 flags:DWORD; time:DWORD;/消息时间戳 dwExtraInfo:DWORD;/和消息相关的扩展信息 end;KBDLLHOOKSTRUCT=tagKBDLLHOOKSTRUCT;PKBDLLHOOKSTRUCT=KBDLLHOOKSTRUCT;const WH_KEYBOARD_LL=13;const LLKHF_ALTDOWN=$20;Var hhkLowLevelKybd:HHOOK;其次定义低级键盘钩子的回调函数,在回调函数中过滤按键消息(WIN、Alt+Tab、Alt+Esc、Ctrl+Esc等)。Function LowLevelKeyboardProc(nCode:Integer;WParam:WPARAM;LParam:LPARAM):LRESULT;stdcall;Var fEatKeystroke:BOOL;p:PKBDLLHOOKSTRUCT;Begin Result:=0; fEatKeystroke:=FALSE; p:=PKBDLLHOOKSTRUCT(lParam); if (nCode=HC_ACTION) then begin/拦截按键消息并测试是否是组合键 case wParam of WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP: fEatKeystroke:=(p.vkCode=vk_LWin) or (P.vkCode=vk_RWin) or(p.vkCode=VK_TAB) and (p.flags and LLKHF_ALTDOWN)0) or(p.vkCode=VK_ESCAPE) and (p.flags and LLKHF_ALTDOWN)0) or(p.vkCode=VK_ESCAPE) and (GetKeyState(VK_CONTROL)0); end; end; if fEatKeystroke then Result:=1; if nCode0 then Result:= CallNextHookEx(0,nCode,wParam,lParam);End;最后是窗体显示时设置钩子调用的回调函数,关闭窗体时释放钩子。procedure TForm3.FormShow(Sender:TObject);beginif hhkLowLevelKybd=0 then/屏蔽热键 hhkLowLevelKybd:=SetWindowsHookExW( WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0);end;procedure TForm3.FormClose(Sender:TObject;var Action:TCloseAction);begin/有屏蔽热键时取消屏蔽if hhkLowLevelKybd0 then if UnhookWindowsHookEx(hhkLowLevelKybd) then hhkLowLevelKybd:=0;end;考虑到热键Ctrl+Alt+Del优先级较高,一般的钩子技术是无法屏蔽的,所以只能用注册表技术屏蔽任务管理器以间接屏蔽这个组合。在屏蔽任务管理器之前要先关闭任务管理器,然后设置任务管理器禁用,具体代码如下。Function DisableTaskmgr(Key:Boolean):Boolean;Var Reg:TRegistry; hnd:integer;Beginresult:=false;hnd:=Findwindow(nil,Windows 任务管理器);if hnd0 then PostMessage(Hnd,WM_Close,0,0);Reg:=TRegistry.Create;tryReg.RootKey:=HKEY_CURRENT_USER;if Reg.OpenKey(SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem,true) thenbegin/任务管理器1禁用0可用 Reg.WriteInteger(DisableTaskMgr,ord(key); Reg.CloseKey; result:=true;end;exceptend;Reg.Free;end;5 屏蔽某些应用程序的智能提示信息要将标题含有“金山词霸”等字样的进程关闭,首先定义枚举窗体的回调函数,在回调函数中将标题含有“金山词霸”的进程关闭.枚举所有窗体的回调函数代码如下。Function EnumWindowsProc(hnd: HWND; lParam: LPARAM):Boolean;stdcall;var wName:array0.32 of Char;beginresult:=true

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论