linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > Delphi >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·HexToStr函数和StrToHex函数
·Delphi中的进制转换
·DELPHI组件安装全攻略
·delphi轻松设置无边框透明窗体
·delphi动态创建控件
·delphi第三方控件安装(Ehlib)
·如何判断文本文件的编码格式
·开发工具比较Visual C++ VS De
·深入研究Variant数组
·delphi完整身份证效验程序实例
·Delphi和Java实现webservice架
·用delphi编写网络游戏的外挂
·delphi设置控件透明
·Delphi技巧-用户自定义数据类型
·delphi编程获取打印机的打印任
最新文章
·在应用程序中跟踪MOUSE的坐标
·压缩和修复MS Access 2000文件
·DELPHI 6.0 动画制做
·怎样在Delphi中调用LastError信
·怎样得到主域服务器名称
·怎样利用递归实现删除某一目录
·读出主键下所有项
·如何制作照片底片效果的图像(
·获得Modem的状态
·WebBrowser屏幕滚动的实现,设
·有关字符串处理的小技巧
·Delphi建立键盘鼠标动作纪录与
·Delphi中布尔类型辨析
·DELPHI程序注册码设计
·图形的不规则的Copy
Google
 
在应用程序中跟踪MOUSE的坐标
[ 作者:  加入时间:2007-12-13 13:01:05  来自:Linux联盟收集整理 ]
跟踪MOUSE坐标很常见,容易又特别不容易,非常说明WINDOWS95下编程的特点。

  { 如果您看不懂,请买DELPHI 2 UNLEASHED RMB133,当然他没这个程序,但有一些写WIN HOOK必须具备的知识。本程序得到AIMING大虾的大力协助,事实上我的程序是在他的基础上改写的,他的是从DELPHI HELP中改写出来的。调试程序花了我两个礼拜,最好你能花同样的时间,那么你就会收获很多! }

  第一步,建一DLL,DELPHI中NEW-》DLL SAVE AS GETKEY


library getKey;

uses
SysUtils,
Windows,
HookMain in hookmain.pas;

exports
OpenGetKeyHook,
CloseGetKeyHook,
GetPublicP;

begin
  NextHook := 0;
  procSaveExit := ExitProc;
  DLLproc := @DLLMain;
  ExitProc := @HookExit;
  DLLMain(DLL_PROCESS_ATTACH);
end.

第二步,建一UNIT ,HOOK MAIN。关键在于CreateFileMapping 和 消息 WM_NCMouseMove, WM_MOUSEMOVE:


unit HookMain;

interface
uses Windows, Messages, Dialogs, SysUtils;

//type DataBuf = Array [1..2] of DWORD;
type mydata=record
data1:array [1..2] of DWORD;
data2:TMOUSEHOOKSTRUCT;
end;
var hObject : Thandle;
pMem : Pointer;
NextHook: Hhook;
procSaveExit: Pointer;

function HookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export;
function OpenGetKeyHook(sender : HWND;MessageID : WORD) : BOOL; export;
function CloseGetKeyHook: BOOL; export;
function GetPublicP : Pointer;stdcall; export;
Procedure DLLMain(dwReason:Dword); far;
procedure HookExit; far;

implementation

Procedure UnMapMem;
begin
  if Assigned(pMem) then
  begin
    UnMapViewOfFile(pMem);
    pMem := Nil
  end;
end;

Procedure MapMem;
begin
  hObject := CreateFileMapping($FFFFFFFF,Nil,Page_ReadWrite,0,$FFFF,pChar(_IOBuffer));
  if hObject = 0 then Raise Exception.Create(创建公用数据的Buffer不成? ;
  pMem := MapViewOfFile(hObject,FILE_MAP_WRITE,0,0,SizeOf(mydata));
  
// 1 or SizeOf(DataBuf) ????
// 创建SizeOf(DataBuf)的数据区
if not Assigned(pMem) then
  begin
    UnMapMem;
    Raise Exception.Create(创建公用数据的映射关系不成功!);
  end;
end;
Procedure DLLMain(dwReason:Dword); far;
begin
  Case dwReason of
  DLL_PROCESS_ATTACH :
  begin
    pMem := nil;
    hObject := 0;
    MapMem;
//以下的公有数据,如tHWND,tMessageID将直接使用本Buf.
End;
    DLL_PROCESS_DETACH : UnMapMem;
    DLL_THREAD_ATTACH,
    DLL_THREAD_DETACH :;
//缺省
end;
end;

procedure HookExit; far;
begin
  CloseGetKeyHook;
  ExitProc := procSaveExit;
end;

function GetPublicP : Pointer;export;
begin
//这里引出了公用数据区的指针,你可以在你的应用程序中自由操作它。但建议去掉此接口。
Result := pMem;
end;

function HookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export;
begin
  Result := 0;
  If iCode $#@60; 0
  Then Result := CallNextHookEx(NextHook, iCode, wParam, lParam);
  
  
  
// This is probably closer to what you would want to do...
Case wparam of
  WM_LBUTTONDOWN:
  begin
  end;
  WM_LBUTTONUP:
  begin
  end;
  WM_LBUTTONDBLCLK:
  begin
  end;
  WM_RBUTTONDOWN:
  begin
    messagebeep(1);
  end;
  WM_RBUTTONUP:
  begin
  end;
  WM_RBUTTONDBLCLK:
  begin
  end;
  WM_MBUTTONDOWN:
  begin
  end;
  WM_MBUTTONUP:
  begin
  end;
  WM_MBUTTONDBLCLK:
  begin
  end;
  WM_NCMouseMove, WM_MOUSEMOVE:
  begin
    mydata(pmem^).data2:=pMOUSEHOOKSTRUCT(lparam)^;
    
// messagebeep(1);
//SendMessage(DataBuf(pMem^)[1],DataBuf(pMem^)[2],wParam,lParam );
SendMessage(mydata(pMem^).data1[1],mydata(pMem^).data1[2],wParam,integer(@(mydata(pmem^).data2)) );
  end;
end;
//发送消息
end;

function OpenGetKeyHook(sender : HWND;MessageID : WORD) : BOOL; export;
begin
  Result := False;
  if NextHook $#@60;$#@62; 0 then Exit;
//已经安装了本钩子
// DataBuf(pMem^)[1] := Sender; //填数据区
// DataBuf(pMem^)[2] := MessageID; //填数据区
mydata(pmem^).data1[1]:=sender;
  mydata(pmem^).data1[2]:=messageid;
  
  NextHook := SetWindowsHookEx(WH_mouse, HookHandler, Hinstance, 0);
  Result := NextHook $#@60;$#@62; 0;
end;

function CloseGetKeyHook: BOOL; export;
begin
  if NextHook $#@60;$#@62; 0 then
  begin
    UnhookWindowshookEx(NextHook);
//把钩子链链接到下一个钩子处理上.
NextHook := 0;
  end;
  Result := NextHook = 0;
end;

end.



第三步,测试DLL,建一PROJECT。关键在于override WndProc


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(Tform)
uncapture: Tbutton;
capture: Tbutton;
Exit: Tbutton;
Panel1: Tpanel;
show: Tlabel;

Label1: Tlabel;
counter: Tlabel;
procedure ExitClick(Sender: Tobject);
procedure uncaptureClick(Sender: Tobject);
procedure captureClick(Sender: Tobject);
private
{ Private declarations }
public
{ Public declarations }
procedure WndProc(var Message: Tmessage); override;
end;

var
Form1: TForm1;
var num : integer;
const MessageID = WM_User + 100;
implementation

{$R *.DFM}
function OpenGetKeyHook(sender : HWND;MessageID : WORD) : BOOL; external GetKey.DLL;
function CloseGetKeyHook: BOOL; external GetKey.DLL;

procedure TForm1.ExitClick(Sender: Tobject);
begin
  close;
end;

procedure TForm1.uncaptureClick(Sender: Tobject);
begin
  if CloseGetKeyHook then
//ShowMessage(结束记录...);
show.caption:=结束记录...;
end;

procedure TForm1.captureClick(Sender: Tobject);
begin
  
// if OpenGetKeyHook(self.Handle,MessageID) then ShowMessage(开始记录...);

  if OpenGetKeyHook(Form1.Handle,MessageID) then
  
//ShowMessage(开始记录...);
show.caption:=开始记录...;
  num := 0;
  
  
end;

procedure TForm1.WndProc(var Message: Tmessage);
var x,y:integer;
begin
  if Message.Msg = MessageID then
  begin
    
// Panel1.Caption := IntToStr(Num);
x:=PMouseHookStruct( message.lparam)^.pt.x ;
    y:=PMouseHookStruct( message.lparam)^.pt.y ;
    
    panel1.caption:=x=+inttostr(x)+ y=+inttostr(y);
    inc(Num);
    counter.Caption := IntToStr(Num);
  end
  else Inherited;
end;

end.

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·PHP中通过Web执行C/C++应用程序  (2007-12-03 15:55:58)
 ·web应用程序中的数据库连接  (2007-11-28 13:51:36)
 ·用程序设置COM+应用程序的属性  (2007-11-26 13:32:26)
 ·用程序删除已注册的COM+应用程序  (2007-11-26 13:31:25)
 ·PHP与已存在的Java应用程序集成  (2007-11-22 14:10:44)
 ·用定制的PHP应用程序来获取Web服务器的状态信息  (2007-11-22 11:15:36)
 ·VB2005中开发新一代控制台应用程序3  (2007-11-16 13:09:25)
 ·使用ADO.NET设计数据库应用程序  (2007-11-15 15:16:47)
 ·用.Net开发DB2应用程序比较  (2007-11-15 15:13:40)
 ·设计.NET应用程序数据访问层五大原则  (2007-11-15 15:08:38)