选择显示字体大小

建立键盘鼠标动作纪录与回放

  很多的教学软件或系统监视软件可以自动记录回放用户的输入文字或点击按钮等操作操作,这个功能的实现是使用了windows的hook函数。 windows提供api函数setwindowshookex来建立一个hook,通过这个函数可以将一个程序添加到hook链中监视windows消息,函数语法为:

   setwindowshookex(idhook: integer; lpfn: tfnhookproc; hmod: hinst; dwthreadid: dword)

   其中参数idhook指定建立的监视函数类型。通过windows msdn帮助可以看到,setwindowshookex函数提供15种不同

  的消息监视类型,在这里我们将使用wh_journalrecord和wh_journalplayback来监视键盘和鼠标操作。参数lpfn指定消息函数,在相应的消息产生后,系统会调用该函数并将消息值传递给该函数供处理。函数的一般形式为:

   hookproc (code: integer; wparam: wparam; lparam: lparam): lresult stdcall;

   其中code为系统指示标记,wparam和lparam为附加参数,根据不同的消息监视类型而不同。只要在程序中建立这样一个函数再通过setwindowshookex函数将它加入到消息监视链中就可以处理消息了。

   在不需要监视系统消息时需要调用提供unhookwindowshookex来解除对消息的监视。

   wh_journalrecord和wh_journalplayback类型是两种相反的hook类型,前者获得鼠标、键盘动作消息,后者回放鼠标键盘消息。所以在程序中我们需要建立两个消息函数,一个用于纪录鼠标键盘操作并保存到一个数组中,另一个用于将保存的操作返给系统回放。

   下面来建立程序,在delphi中建立一个工程,在form1上添加3个按钮用于程序操作。另外再添加一个按钮控件和一个edit控件用于验证操作。下面是form1的全部代码 

  unit unit1; 

  interface

  uses

   windows, messages, sysutils, classes, graphics, controls, forms, dialogs,

   stdctrls;  

  type

   tform1 = class(tform)

   button1: tbutton;

   button2: tbutton;

   button3: tbutton;

   edit1: tedit;

   button4: tbutton;

   procedure formcreate(sender: tobject);

   procedure button1click(sender: tobject);

   procedure button2click(sender: tobject);

   procedure button3click(sender: tobject);

   private

   { private declarations }

   public

   { public declarations }

   end;  

  var

   form1: tform1;  

   eventarr:array[0..1000]of eventmsg;

   eventlog:integer;

   playlog:integer;

   hhook,hplay:integer;

   recok:integer;

   canplay:integer;

   bdelay:bool;

  implementation

  

  {$r *.dfm}

  function playproc(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;

  begin

   canplay:=1;

   result:=0;  

   if icode < 0 then //必须将消息传递到消息链的下一个接受单元

   result := callnexthookex(hplay,icode,wparam,lparam)

   else if icode = hc_sysmodalon then

   canplay:=0

   else if icode = hc_sysmodaloff then

   canplay:=1

   else if ((canplay =1 )and(icode=hc_getnext)) then begin

   if bdelay then begin

   bdelay:=false;

   result:=50;

   end;

   peventmsg(lparam)^:=eventarr[playlog];

   end

   else if ((canplay = 1)and(icode = hc_skip))then begin

   bdelay := true;

   playlog:=playlog+1;

   end;

   if playlog>=eventlog then begin

   unhookwindowshookex(hplay);

   end;

  end;  

  function hookproc(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;

  begin

   recok:=1;

   result:=0;  

   if icode < 0 then

   result := callnexthookex(hhook,icode,wparam,lparam)

   else if icode = hc_sysmodalon then

   recok:=0

   else if icode = hc_sysmodaloff then

   recok:=1

   else if ((recok>0) and (icode = hc_action)) then begin

   eventarr[eventlog]:=peventmsg(lparam)^;

   eventlog:=eventlog+1;  

   if eventlog>=1000 then begin

   unhookwindowshookex(hhook);

   end;

   end;

  end;  

  procedure tform1.formcreate(sender: tobject);

  begin

   button1.caption:='纪录';

   button2.caption:='停止';

   button3.caption:='回放';

   button4.caption:='范例';

   button2.enabled:=false;

   button3.enabled:=false;

  end;  

  procedure tform1.button1click(sender: tobject);

  begin

   eventlog:=0;

   //建立键盘鼠标操作消息纪录链

   hhook:=setwindowshookex(wh_journalrecord,hookproc,hinstance,0);

   button2.enabled:=true;

   button1.enabled:=false;

  end;  

  procedure tform1.button2click(sender: tobject);

  begin

   unhookwindowshookex(hhook);

   hhook:=0;  

   button1.enabled:=true;

   button2.enabled:=false;

   button3.enabled:=true;

  end;  

  procedure tform1.button3click(sender: tobject);

  begin

   playlog:=0;

   //建立键盘鼠标操作消息纪录回放链

   hplay:=setwindowshookex(wh_journalplayback,playproc,

   hinstance,0);

   button3.enabled:=false;

  end;  

  end.  

   代码添加完毕后,运行程序,点击“纪录”按钮开始纪录操作,这时你可以在文本控件中输入一些文字或者点击“范例”按钮,然后点击“停止”按钮停止纪录,再点击“回放”按钮就可以讲先前所做的操作回放。在上面的程序中,hookproc是纪录操作的消息函数,每当有鼠标键盘消息发生时,系统都会调用该函数,消息信息就保存在地址lparam中,我们可以讲消息保存在一个数组中。playproc是消息回放函数,当系统可以执行消息回放时调用该函数,程序就将先前纪录的消息值返回到lparam指向的区域中,系统就会执行该消息,从而实现了消息回放。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons