监视、控制计算机的使用-1_第1页
监视、控制计算机的使用-1_第2页
监视、控制计算机的使用-1_第3页
监视、控制计算机的使用-1_第4页
监视、控制计算机的使用-1_第5页
全文预览已结束

下载本文档

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

文档简介

监视、控制计算机的使用

基于WindowsNT/2000的应用系统中,一些关键的人机交互工作站,常需要了解并记录全部操作人员操作计算机的状况。如:在工业掌握领域,一些使用计算机对设备进行监视和掌握的工作站,需要特别高的牢靠性和平安性。在这些工作站上通常要求只能运行系统所要求的应用程序,不能运行与系统无关的程序,同时要求对计算机操作人员的全部原始输入进行记录,以便消失事故(如操作故障、程序特别退出)的时候,用来分析是人为缘由,还是系统缘由造成的。基于以上需求,我们必需解决两个问题,一个是如何记录操作人员的输入,另一个是如何掌握操作人员的输入。在DOS、Windows3.1、Windows95/98中都可以编写响应键盘和鼠标输入的中断处理程序,截取来自键盘和鼠标的输入,记录、分析后依状况分别处理。但是在WindowsNT和Windows2000中,这样的解决方法将不再行得通,这是由于WindowsNT/2000操作系统为了提高系统的牢靠性,不再允许应用程序直接对系统设备的底层进行操作。这样,用户的应用程序将不能够对计算机的端口地址进行读写操作,所以在WindowsNT/2000操作系统中对计算机端口的读写是无效的。另外一种方法能够特别完善地解决这个问题,就是可以编写操作系统的设备驱动程序来解决,但是要编写系统的设备驱动程序,必需对WindowsNT/2000的系统底层以及整个系统架构有比较深化的了解。而且设备驱动程序的编写、调试都比较困难,同时这方面的资料也比较少。所以本文没有实行这种方法,而是采纳微软公布的标准Win32函数和钩子技术来解决这个问题,比较便利而且快捷。在WindowsNT/2000操作系统中,称各种输入为大事(Event),全部的键盘、鼠标输入大事以及其他大事都是通过消息传递处理机制来得到响应的。掌握、监视计算机实际上是掌握、监视大事消息流。Windows操作系统为这种应用供应钩子(Hook)技术。这种技术的要点就是在操作系统的消息传递处理机制上外挂一个我们定义的函数,可以使用这个函数来监视、掌握系统的大事消息流。本文采纳的就是这种方法,这种方法要求将全部的程序代码放入系统可以加载的动态链接库中。下面我们以键盘输入的监视和掌握为例具体叙述这种方法。其总体思路如下:首先,定义自己的钩子函数。其次,安装自定义的钩子函数,此后钩子函数在后台开头工作。一旦系统发觉击键动作或者鼠标动作,系统将立刻调用该自定义的钩子函数,并将大事消息传入,供程序分析推断。它可以监视全部的击键和鼠标动作,与DOS时代的中断调用有特别相像的地方。最终,卸载自定义的钩子函数。钩子函数的定义微软的钩子技术的原理就是应用程序可以在系统的消息处理机制上外挂一个子程序,在消息尚未到达目的地之前,用该子程序来截获此消息,以进行监视和掌握。我们这里使用的是WH_KEYBOARD_LL类型的钩子函数,这种类型的钩子函数可以截获全部的键盘大事,即敲击键盘上的任何一个键,我们自定义的钩子函数都可以知道。该类型钩子函数要求安装自定义的钩子函数必需是以下原型:LRESULTCALLBACKLowLevelKeyboard-Proc(intnCode,WPARAMwParam,LPARAMlParam);其中各参数的含义如下:intnCode:用来打算钩子函数如何处理大事消息的代码,参数的取值为HC_ACTION时,参数wParam、lParam包含了所需的键盘消息大事信息。WPARAMwParam:键盘消息大事的类型ID。该参数有四种可能的消息类型取值:WM_KEY-DOWN,WM_KEYUP,WM_SYSKEYDOWN,WM_SYSKEYUP.LPARAMlParam:指向一个类型为KBDLLHOOKSTRUCT的结构指针。该结构容纳了底层键盘输入大事的具体信息,它的定义如下:typedefstructtagKBDLLHOOKSTRUCT{DWORDvkCode;//一个范围从1到254的虚拟键码DWORDscanCode;//键盘的硬件扫描码DWORDflags;//一系列的标志位//0比特位指示该键是不是扩展键(如:功能键,或数字小键盘上的键),1表示是,0表示否//1~3比特位保留//4比特位用来区分该大事是否来自Win32函数keybd_event()调用,1表示是,0表示否//5比特位为状态描述码,假如ALT键按下,该位是1,否则是0。//6比特位保留。//7比特位是变换状态位,键被按下为0,键被释放为1。DWORDtime;//该消息大事的时间标记。DWORDdwExtraInfo;//该消息的其他扩展信息。}KBDLLHOOKSTRUCT,FAR*LPKBDLLHOOKSTRUCT,*PKBDLLHOOKSTRUCT;实际的钩子函数的框架如下:LRESULTCALLBACKMyLowLevelKeyboardProc(intnCode,WPARAMwParam,LPARAMlParam){BOOLbSkipThisEvent=FALSE;HWNDhwndForeground;HWNDhwndFocus;DWORDdwCurrentThreadId;DWORDdwWindowThreadId;if(nCode==HC_ACTION){PKBDLLHOOKSTRUCTp=(PKBDLLHOOKSTRUCT)lParam;//系统传递来的键盘输入大事信息指针switch(wParam){caseWM_SYSKEYUP:caseWM_KEYUP://ifkeyup/*这段代码用来获得当前拥有输入焦点的窗口的窗口句柄,以便获得该窗口的相关信息*//*获得前端窗口(即用户当前正在工作的窗口)的句柄,创建该窗口的线程通常拥有比其他线程略微高一些的优先级。*/hwndForegroud=::GetForegroundWindow();dwCurrentThreadId=::GetCurrentThreadId();//当前线程的Id//获得产生前端窗口hwndForeground的线程Id值,用来惟一表示一个线程dwWindowThreadId=::GetWindowThread-ProcessId(hwndForegroud,NULL);/*下面这一行代码特别重要,它的作用是使当前线程(dwCurrentThreadId)的输入处理机制依附到创建前端窗口的线程(dwWindowThreadId)的输入机制上,否则你将得不到当前拥有键盘输入焦点的窗口句柄。这是由于在WindowsNT/2000操作系统通常创建不同的线程来处理相互独立的输入过程,每一个输入过程都拥有自己的输入状态(焦点、键盘状态、队列状态等),通过AttachThreadInput调用,操作系统将允许调用线程获得或者设置其他线程生成窗口的输入状态信息。只有执行该系统调用,才能够得到当前拥有键盘输入焦点的窗口的窗口句柄,否则GetFocus()系统调用将返回NULL。在这一点上WindowsNT/2000与Windows9X操作系统有很大不同,这也正是WindowsNT/2000比Windows95/98操作系统牢靠性、平安性更好的一个缘由*/AttachThreadInput(dwCurrentThreadId,dwWindowThreadId,TRUE);////获得拥有键盘输入焦点的窗口的窗口句柄hwndFocus=::GetFocus();if(hwndFocus||hwndForeground){charwnm[256];wnm[0]=0;//变量定义后,使用之前肯定要初始化。//获得该窗口的窗口标题,就是在窗口标题栏上显示的内容::GetWindowText(hwndForeground,wnm,255);charclsnm[266];clsnm[0]=0;//获得该窗口的类名字::GetClassName(hwndFocus,clsnm,255);//获得该窗口的风格LONGstyle=::GetWindowLong(hwfocus,GWL_STYLE);/*假如你只对部分窗口感爱好的话,可以通过下面的形式进行过滤,从而只处理你所感爱好的某些窗口的输入大事*/if((stricmp(clsnm,“edit”

温馨提示

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

评论

0/150

提交评论