请大家帮忙看看我的鼠标钩子有什么问题?双击消息得不到。

fisher_older 2011-03-31 07:07:26
编写了一个鼠标钩子,右键点击的消息能够截获,但是双击消息不能截获,请高手指点。

dll程序如下:
library Mouse_HookDLL;

uses
SysUtils,
Windows,
Messages,
Classes;

const WH_MOUSE_LL=14;

{$R *.res}

var
NextHook : HHook;
CallHandle : HWND;
MessageID : Word;

function HookProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
begin
Result := 0;
if code < 0 then
Result := CallNextHookEx(NextHook,code,wParam,lParam);
case wParam of
WM_LBUTTONDOWN:
begin
end;
WM_LBUTTONUP:
begin
end;
WM_LBUTTONDBLCLK:
begin
SendMessage(CallHandle,MessageID,wParam,Integer(@pMouseHookStruct(lParam)^));
end;
WM_RBUTTONDOWN:
begin
end;
WM_RBUTTONUP:
begin
SendMessage(CallHandle,MessageID,wParam,Integer(@pMouseHookStruct(lParam)^));
end;
WM_NCMOUSEMOVE,WM_MOUSEMOVE:
begin
end;
end;
end;

//启动钩子
function StartHook(MsgID:Word):Bool;stdcall;
begin
Result := False;
if NextHook <> 0 then
Exit;
MessageID := MsgID;
NextHook := SetWindowsHookEx(WH_MOUSE_LL,@HookProc,HInstance,0);
Result := NextHook <> 0;
end;

//脱钩
function StopHook:Bool;stdcall;
begin
if NextHook <> 0 then
begin
UnHookWindowsHookEx(NextHook);
NextHook := 0;
end;
Result := NextHook = 0;
end;

//传递调用者句柄
procedure SetCallHandle(sender:HWND);stdcall;
begin
CallHandle := sender;
NextHook := 0;
end;

exports
StartHook name 'StartHook',
StopHook name 'StopHook',
SetCallHandle name 'SetCallHandle';

begin
end.
...全文
229 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fisher_older 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lactoferrin 的回复:]
WH_MOUSE_LL不需要用dll
你的任务还是获得在资源管理器中打开的文件?
[/Quote]

是在,怎么获得资源管理器中选中的文件呢?应该是响应鼠标单击的消息吧?
Lactoferrin 2011-04-03
  • 打赏
  • 举报
回复
WH_MOUSE_LL又不是WH_MOUSE
skyliu1234 2011-04-03
  • 打赏
  • 举报
回复
const WH_MOUSE_LL=14;
这里=14是怎么来的,是不是应该改成7,delphi 里面定义 WH_MOUSE=7;
Lactoferrin 2011-04-02
  • 打赏
  • 举报
回复
WH_MOUSE_LL不需要用dll
你的任务还是获得在资源管理器中打开的文件?
Lactoferrin 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fisher_older 的回复:]

引用 6 楼 lactoferrin 的回复:
WH_MOUSE_LL不能获得双击消息,你要根据两次单击时间自己判断

你还在弄那个东西?


呵呵,是啊,没办法啊,任务没有完成呢。
我试过WH_MOUSE,连右键都捕获不到了。
根据两次单击时间判断该怎么做呢?
[/Quote]
判断两次按键时间是不是小于GetDoubleClickTime
fisher_older 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lactoferrin 的回复:]
判断两次按键时间是不是小于GetDoubleClickTi……
[/Quote]

兄弟,恕我愚钝,具体怎么做?如果用dll的方法,如何判断?
fisher_older 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lw19860412 的回复:]
小小年纪就弄钩子,不学好
[/Quote]

哈,没办法呢。
fisher_older 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lactoferrin 的回复:]
WH_MOUSE_LL不能获得双击消息,你要根据两次单击时间自己判断

你还在弄那个东西?
[/Quote]

呵呵,是啊,没办法啊,任务没有完成呢。
我试过WH_MOUSE,连右键都捕获不到了。
根据两次单击时间判断该怎么做呢?
Lactoferrin 2011-04-02
  • 打赏
  • 举报
回复
WH_JOURNALRECORD没有WH_MOUSE_LL好,因为按了CTRL+BREAK就没用了
zhuang_bx 2011-04-02
  • 打赏
  • 举报
回复
不用DLL也可以,用鼠标录像钩子.
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
WH_MOUSE_LL不能获得双击消息,你要根据两次单击时间自己判断

你还在弄那个东西?
正月龙 2011-04-01
  • 打赏
  • 举报
回复
WM_LBUTTONDBLCLK 不会没有用吧,线程却钩子可以 ,不知道什么原因
正月龙 2011-04-01
  • 打赏
  • 举报
回复
确实不行啊,高手帮助!!!
lw19860412 2011-04-01
  • 打赏
  • 举报
回复
小小年纪就弄钩子,不学好
fisher_older 2011-03-31
  • 打赏
  • 举报
回复
点鼠标右键时Memo1中能显示‘Get it!’,而双击时则不行。请高手指教。多谢了。
fisher_older 2011-03-31
  • 打赏
  • 举报
回复
调用dll的程序为:
private
{ Private declarations }
//重载消息处理
procedure WndProc(var Message: TMessage);override;

const
WM_TestMsg = WM_User + 100;


implementation

{$R *.dfm}
function StartHook(MsgID:Word):Bool;stdcall;external 'Mouse_HookDLL.dll';
function StopHook:Bool;stdcall;external 'Mouse_HookDLL.dll';
procedure SetCallHandle(sender:HWND);stdcall;external 'Mouse_HookDLL.dll';



procedure TForm1.FormShow(Sender: TObject);
begin
SetCallHandle(Self.Handle);
if not StartHook(WM_TestMsg) then //WM_TestMsg为自定义消息
begin
ShowMessage('挂钩失败!');
end;
end;


procedure TForm1.WndProc(var Message: TMessage);
begin
//得到符合条件的钩子
if Message.Msg = WM_TestMsg then
begin
memo1.Lines.Add('Get it!');
end;
inherited;
end;
fisher_older 2011-03-31
  • 打赏
  • 举报
回复
求助。谢谢了。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧