计算机二级DELPHI辅导:Hook技术实现键盘监控
来源:优易学  2011-6-7 12:06:23   【优易学:中国教育考试门户网】   资料下载   IT书店

 

  二、Win95/98使用任务栏右方指示区来显示应用程序或工具图标对指示区图标的操作涉及了一个API函数Shell_NotifyIcon,它有两个参数,一个是指向TnotifyIconData结构的指针,另一个是要添加、删除、改动图标的标志。通过该函函数将应用程序的图标添加到指示区中,使其作为图标运行,增加专业特色。当程序起动后,用鼠标右键点击图标,则弹出一个菜单,可选择sethook或endhook。
  unit kb;
  interface
  uses
  Windows, Messages, SysUtils, Classes,
  Graphics, Controls, Forms,
  Dialogs,
  StdCtrls, Menus,shellapi;
  const
  icon_id=1;
  MI_iconevent=wm_user+1;//定义一个用户消息
  type
  TForm1 = class(TForm)
  PopupMenu1: TPopupMenu;
  sethook1: TMenuItem;
  endhook1: TMenuItem;
  N1: TMenuItem;
  About1: TMenuItem;
  Close1: TMenuItem;
  Gettext1: TMenuItem;
  procedure FormCreate(Sender: TObject);
  procedure sethook1Click(Sender: TObject);
  procedure endhook1Click(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  procedure Close1Click(Sender: TObject);
  private
  { Private declarations }
  nid:tnotifyicondata;
  normalicon:ticon;
  public
  { Public declarations }
  procedure icontray(var msg:tmessage);
  message mi_iconevent;
  end;
  var
  Form1: TForm1;
  implementation
  {$R *.DFM}
  function setkeyhook:bool;external \'keyspy.dll\';
  function endkeyhook:bool;external \'keyspy.dll\';
  procedure tform1.icontray(var msg:tmessage);
  var
  pt:tpoint;
  begin
  if msg.lparam=wm_lbuttondown then
  sethook1click(self);
  if msg.LParam=wm_rbuttondown then
  begin
  getcursorpos(pt);
  setforegroundwindow(handle);
  popupmenu1.popup(pt.x,pt.y);
  end;
  end;
  procedure TForm1.FormCreate(Sender: TObject);
  begin
  normalicon:=ticon.create;
  application.title:=caption;
  nid.cbsize:=sizeof(nid);
  nid.wnd:=handle;
  nid.uid:=icon_id;
  nid.uflags:=nif_icon or nif_message or nif_tip;
  nid.ucallbackmessage:=mi_iconevent;
  nid.hIcon :=normalicon.handle;
  strcopy(nid.sztip,pchar(caption));
  nid.uFlags:=nif_message or nif_icon or nif_tip;
  shell_notifyicon(nim_add,@nid);
  SetWindowLong(Application.Handle,
  GWL_EXSTYLE,WS_EX_TOOLWINDOW);
  end;
  procedure TForm1.sethook1Click(Sender: TObject);
  begin
  setkeyhook;
  end;
  procedure TForm1.endhook1Click(Sender: TObject);
  begin
  endkeyhook;
  end;
  procedure TForm1.FormDestroy(Sender: TObject);
  begin
  nid.uFlags :=0;
  shell_notifyicon(nim_delete,@nid);
  end;
  procedure TForm1.Close1Click(Sender: TObject);
  begin
  application.terminate;
  end;
  该程序虽然只用了几个shellai函数,但是它涉及到了在Delphi中对DLL的引用、钩子实现、对指示区的操作、用户定义消息的处理、文件的读写等比较重要的内容,我相信这篇文章能对许多Delphi的初学者有所帮助。
  该程序在Win98、Delphi4.0中正常运行。

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训