如何建立一个全局的鼠标钩子? 这个钩子要实现可以捕获除了本窗体外的所有鼠标位置信息。我目前实现的是可以得到本窗体上鼠标移动的信息,当把鼠标移出到其他应用程序上时,就无法得到鼠标信息了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button2Click(Sender: TObject); private { Private declarations } Procedure Hook(En: Boolean = true); public { Public declarations } end;var Form1: TForm1; hHook: LongWord; xy: TPoint;implementation{$R *.dfm}function HookProc(iCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;begin if(peventmsg(lparam)^.message = WM_LBUTTONDOWN) Or (peventmsg(lparam)^.message = WM_LBUTTONUP) Or (peventmsg(lparam)^.message = WM_LBUTTONDBLCLK) Or (peventmsg(lparam)^.message = WM_MOUSEMOVE) Or (peventmsg(lparam)^.message = WM_RBUTTONDOWN) Or (peventmsg(lparam)^.message = WM_RBUTTONUP) Or (peventmsg(lparam)^.message = WM_RBUTTONDBLCLK) Or (peventmsg(lparam)^.message = WM_MBUTTONDOWN) Or (peventmsg(lparam)^.message = WM_MBUTTONUP) Or (peventmsg(lparam)^.message = WM_MBUTTONDBLCLK) then begin GETCURSORPOS(XY); form1.Caption := IntToStr(XY.x) + ' ' + IntToStr(XY.y); end; Result := CallNextHookEx(hHook, iCode, wParam, lParam);end;procedure TForm1.Button1Click(Sender: TObject);begin Hook;end;procedure TForm1.Hook(En: Boolean);begin if En then hHook := SetwindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0) else UnHookWindowsHookEx(hHook);end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin Hook(false);end;procedure TForm1.Button2Click(Sender: TObject);begin Hook(false);end;end. Kevin_Lmx(繁华阅尽) ( )能具体说明一下实现的要点嘛? to cdsgajxlp(新手) 你的这种方法只能在本form内得到鼠标钩子 建立系统范围的Windows钩子要向某个进程注入DLL,一个十分普遍也是比较简单的方法就是建立在标准的Windows钩子的基础上。Windows钩子一般是在DLL中实现的,这是一个全局性的Windows钩子的基本要求。当我们成功地调用SetWindowsHookEx函数之后,便在系统中安装了某种类型的消息钩子,这个钩子可以是针对某个进程,也可以是针对系统中的所有进程。一旦某个进程中产生了该类型的消息,操作系统会自动把该钩子所在的DLL映像到该进程的地址空间中,从而使得消息回调函数(在SetWindowsHookEx的参数中指定)能够对此消息进行适当的处理,在这里,我们所感兴趣的当然不是对消息进行什么处理,因此在消息回调函数中只需把消息钩子向后传递就可以了,但是我们所需的DLL已经成功地注入了目标进程的地址空间,从而可以完成后续工作。------------大概是这样。你在网上找找资料吧。^_^ 问题可能就出在:SetwindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0)上,关键是HInstance参数要如何设置 你的这种方法只能在本form内得到鼠标钩子,以外好象也行如果不放心,可以做成DLL更好 WH_JOURNALRECORD是什么参数,怎么得不到鼠标移动和鼠标按下的消息啊如果用WH_MOUSE可以得到鼠标移动和鼠标按下的消息,但只能在本form内? idFtp 的問題,求請幫忙哈!急 新手问题----------ListBoxInt.ItemIndex 我是新手,请教大家一个问题 如何将XML文件导入到paradox数据库(使用BDE)。 不知哪位上次问了一个怎样做圆锥的问题?我做了一个 高手,请进来帮忙,急!!!! 高分紧急求助:如何解决TClientSocket接收数据不稳定的问题 怎么改变菜单栏的颜色? 关于listview控件内实现多个选项(图标)拖动的问题? 救命啊,好人进来吧 急求delphi5.0下载地址.......... 在Dephi中要实现以下功能这句怎么写?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
Procedure Hook(En: Boolean = true);
public
{ Public declarations }
end;var
Form1: TForm1;
hHook: LongWord;
xy: TPoint;implementation{$R *.dfm}function HookProc(iCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;
begin
if(peventmsg(lparam)^.message = WM_LBUTTONDOWN) Or
(peventmsg(lparam)^.message = WM_LBUTTONUP) Or
(peventmsg(lparam)^.message = WM_LBUTTONDBLCLK) Or
(peventmsg(lparam)^.message = WM_MOUSEMOVE) Or
(peventmsg(lparam)^.message = WM_RBUTTONDOWN) Or
(peventmsg(lparam)^.message = WM_RBUTTONUP) Or
(peventmsg(lparam)^.message = WM_RBUTTONDBLCLK) Or
(peventmsg(lparam)^.message = WM_MBUTTONDOWN) Or
(peventmsg(lparam)^.message = WM_MBUTTONUP) Or
(peventmsg(lparam)^.message = WM_MBUTTONDBLCLK)
then
begin
GETCURSORPOS(XY);
form1.Caption := IntToStr(XY.x) + ' ' + IntToStr(XY.y);
end;
Result := CallNextHookEx(hHook, iCode, wParam, lParam);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Hook;
end;procedure TForm1.Hook(En: Boolean);
begin
if En then
hHook := SetwindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0)
else
UnHookWindowsHookEx(hHook);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Hook(false);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
Hook(false);
end;end.
能具体说明一下实现的要点嘛?
你的这种方法只能在本form内得到鼠标钩子
------------
大概是这样。你在网上找找资料吧。^_^
关键是HInstance参数要如何设置
如果不放心,可以做成DLL更好