有关钩子的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 googledcjt
  • 开始时间 开始时间
G

googledcjt

Unregistered / Unconfirmed
GUEST, unregistred user!
我设置了一个简单的捕获鼠标左键单击事件的全局钩子,在一个应用程序主窗体创建的时候InstallHook,在窗体释放的时候UnInstallHook。
为什么在应用程序运行时候不是每次鼠标单击就showmessage?而是偶尔出现一次showmessage?

代码如下:
library HookDll;

uses
Windows, Messages, Imm, Dialogs,
SysUtils,
Classes;

var
aHk :HHOOK;
{$R *.res}

function MouseProc(Code: Integer; WParam: WParam; LParam: LParam): LRESULT;
var
theMsg: TMessage;
begin
Result := 0;
if Code < 0 then begin
Result := CallNextHookEx(aHk, Code, WParam, LParam);
Exit;
end;
if PMsg(LParam).message = WM_LBUTTONDOWN then
ShowMessage('WM_LBUTTONDOWN');
Result := CallNextHookEx(aHk, Code, WParam, LParam);
end;

procedure InstallHook; stdcall;
begin
aHk := SetWindowsHookEx(WH_Mouse, @MouseProc, HInstance, 0);
end;

procedure UnInstallHook; stdcall;
begin
UnHookWindowsHookEx(aHk);
end;

exports
InstallHook, UnInstallHook;

begin
end.
 
这种办法效率不高,容易漏掉消息,应该采用消息通知模式!!
 
to zhaokaien:
消息通知模式?WH_CALLWNDPROC还是WH_GETMESSAGE?异或其它?
请说详细点...
 
WH_GETMESSAGE!
 
to Dstorm:
我使用WH_GETMESSAGE这样的方式,结果还不如WH_Mouse,根本就捕获不到鼠标的单击事件。

请问我上面的代码是否有问题?
 
var
Form1: TForm1;
h : HHOOK;

implementation

{$R *.dfm}


function Proc(Code : Longint ; w: WPARAM;l : LPARAM): LRESULT; stdcall;
begin
if Pmsg(Pointer(l))^.message = WM_LBUTTONDOWN then
Form1.mmo1.Lines.Add('WM_LBUTTONDOWN');

Result := CallNextHookEx(h, Code, w, l);
end;

procedure TForm1.btn1Click(Sender: TObject); //
begin
h := SetWindowsHookEx(WH_GETMESSAGE , Proc, 0, GetCurrentThreadId);
end;
 
to Dstorm:
我的目的是写一个全局钩子,看了你的回复,局部的是可以的,但全局的还是不行,这是为什么?
 
不对 你安装的是鼠标钩子 你的lparam 是 MOUSEHOOKSTRUCT structure. 而你用的 PMsg结构 这个是WH_GetMessage 的lparam结构
 
to ysp娃娃:
那我把SetWindowsHookEx(WH_Mouse, @MouseProc, HInstance, 0);中的参数改成WH_GetMessage就可以了?还是捕获不到啊
 
library HookDll;

uses
Windows,
Messages,
Imm,
Dialogs,
SysUtils,
Classes;

var
aHk :HHOOK;


function MouseProc(Code: Integer; WParam: WParam; LParam: LParam): LRESULT;stdcall;
begin
Result := 0;
if Code < 0 then
Result := CallNextHookEx(aHk, Code, WParam, LParam);
if pMSG(lparam)^.message = WM_LBUTTONDOWN then
ShowMessage('WM_LBUTTONDOWN');
Result := CallNextHookEx(aHk, Code, WParam, LParam);
end;

procedure InstallHook; stdcall;
begin
aHk := SetWindowsHookEx(WH_GETMESSAGE, @MouseProc, HInstance, 0);
end;

procedure UnInstallHook; stdcall;
begin
UnHookWindowsHookEx(aHk);
end;

exports
InstallHook, UnInstallHook;

begin
end.
 
library HookDll;

uses
Windows,
Messages,
Imm,
Dialogs,
SysUtils,
Classes;

var
aHk :HHOOK;


function MouseProc(Code: Integer; WParam: WParam; LParam: LParam): LRESULT;stdcall;
begin
Result := 0;
if Code < 0 then
Result := CallNextHookEx(aHk, Code, WParam, LParam);
if Wparam = WM_LBUTTONDOWN then
MessageBox(0,'WM_LBUTTONDOWN',nil,0);
Result := CallNextHookEx(aHk, Code, WParam, LParam);
end;

procedure InstallHook; stdcall;
begin
aHk := SetWindowsHookEx(WH_MOUSE, @MouseProc, HInstance, 0);
end;

procedure UnInstallHook; stdcall;
begin
UnHookWindowsHookEx(aHk);
end;

exports
InstallHook, UnInstallHook;

begin
end.


这样好像也可以
 
to ysp娃娃:
你贴的这段代码什么意思?你试了,可以? 我改成这样也没什么反映啊
 
function MouseProc(Code: Integer; WParam: WParam; LParam: LParam): LRESULT;
stdcall; stdcall你加了吗
 
"你贴的这段代码什么意思 ?" 我不明白你说这话什么意思。 我闲着没事干了乱贴代码。
我给你回答问题不是为了你那点分
我很少在这上面问问题,所以分对我来说我一点不在乎 只是出于大富翁的精神给你回答问题
 
to ysp娃娃:
好了,原来问题在这里,谢谢
 

Similar threads

后退
顶部