Delphi 鼠标钩子冻结程序

Delphi 鼠标钩子冻结程序,delphi,hook,Delphi,Hook,我下载了一个鼠标挂钩示例,但它不起作用。所以我去掉了所有不必要的东西,想知道里面有什么问题。当我启动程序时,它和Delphi都会冻结,我必须通过taskmgr关闭它 应用程序: 库: 我认为这很简单。冻结发生在调用HookMouse时,当执行这一行时,整个IDE冻结,我无法进一步调试。但我看不出这个过程有什么错 如果有帮助的话,我正在使用XE2。感谢您的故障排除 Edit:我用stdcall编辑了HookMouse和UnhookMouse的调用和要查找的窗口类的名称。它现在似乎工作得很好,它显

我下载了一个鼠标挂钩示例,但它不起作用。所以我去掉了所有不必要的东西,想知道里面有什么问题。当我启动程序时,它和Delphi都会冻结,我必须通过taskmgr关闭它

应用程序:

库:

我认为这很简单。冻结发生在调用
HookMouse
时,当执行这一行时,整个IDE冻结,我无法进一步调试。但我看不出这个过程有什么错

如果有帮助的话,我正在使用XE2。感谢您的故障排除



Edit:我用
stdcall编辑了
HookMouse
UnhookMouse
的调用
和要查找的窗口类的名称。它现在似乎工作得很好,它显示了正确的值,但只有当鼠标光标不在应用程序窗口中时-当我将鼠标移动到窗口时,它会变为沙漏,并且标签标题停止更新。什么原因会导致这种情况?

您的代码有一些问题

1.您缺少
stdcall
调用约定:

procedure HookMouse; stdcall; external 'MouseHook.DLL';
procedure UnHookMouse; stdcall; external 'MouseHook.DLL';
2.您正在更改主窗体中的标题。因此
FindWindow
(在DLL中)将只找到该窗口一次。您可以使用TMemo进行调试:

procedure TMainHookTestForm.ms(var message: tmessage);
begin
  Memo1.Lines.Add(format('%d - %d',[message.LParam, message.WParam]));
end;
2.1.类名
MainHookTestForm
不正确。应该是:

FindWindow('TMainHookTestForm', 'Main')
请注意TMainHookTestForm

3.在
HookProc
中,您必须使用:

if nCode = HC_ACTION then
begin
  mousePoint := PMouseHookStruct(Data)^.pt;      
  PostMessage(FindWindow('TMainHookTestForm', 'Main'), WM_USER+1234, mousePoint.X, mousePoint.Y);
end;  

Result := CallNextHookEx(Hook,nCode,MsgID,Data);

您的代码有一些问题

1.您缺少
stdcall
调用约定:

procedure HookMouse; stdcall; external 'MouseHook.DLL';
procedure UnHookMouse; stdcall; external 'MouseHook.DLL';
2.您正在更改主窗体中的标题。因此
FindWindow
(在DLL中)将只找到该窗口一次。您可以使用TMemo进行调试:

procedure TMainHookTestForm.ms(var message: tmessage);
begin
  Memo1.Lines.Add(format('%d - %d',[message.LParam, message.WParam]));
end;
2.1.类名
MainHookTestForm
不正确。应该是:

FindWindow('TMainHookTestForm', 'Main')
请注意TMainHookTestForm

3.在
HookProc
中,您必须使用:

if nCode = HC_ACTION then
begin
  mousePoint := PMouseHookStruct(Data)^.pt;      
  PostMessage(FindWindow('TMainHookTestForm', 'Main'), WM_USER+1234, mousePoint.X, mousePoint.Y);
end;  

Result := CallNextHookEx(Hook,nCode,MsgID,Data);


尝试以管理员身份运行示例-我记得我的VB6 windows钩子应用程序在windows 7中出现问题。我正在运行一个管理员帐户,但即使右键单击exe并运行admin也没有帮助不确定是否有帮助,但由于您使用
stdcall
指令声明了
HookMouse
,在从DLL导入函数时尝试包含它,即
过程钩住鼠标;stdcall;外部“MouseHook.DLL”我建议使用低级鼠标挂钩。最大的优点是,您的dll不会被注入到所有其他应用程序中,事实上,您一开始甚至不需要dll。亲爱的downvoter,您能提供您的决定背后的进一步原因吗?我试图让问题尽可能清楚,如果您遗漏了什么,请推荐,我会添加它。尝试以管理员身份运行示例-我记得我的VB6 windows hook应用在windows 7中出现了问题。我正在运行一个管理员帐户,但即使右键单击exe并运行admin也没有帮助我不确定它是否有帮助,但是,由于您使用
stdcall
指令声明了
HookMouse
,因此在从DLL导入函数时尝试将其包括在内,即
procedure HookMouse;stdcall;外部“MouseHook.DLL”我建议使用低级鼠标挂钩。最大的优点是,您的dll不会被注入到所有其他应用程序中,事实上,您一开始甚至不需要dll。亲爱的downvoter,您能提供您的决定背后的进一步原因吗?我尽量把问题弄清楚,如果你遗漏了什么,就表扬一下,我会补充。我对代码做了一些修改,所以我做了一些改动。我会相应地更新问题。在我发布答案后,我会尝试一下,至少在你修改代码的地方对代码进行注释。您的类名在DLL FindWoodow中仍然不正确:应该是:tmainhookTestForm抱歉,请查看我答案底部的编辑部分。一切都很好。尝试使用
WH\u MOUSE\u LL
(14)而不是
WH\u MOUSE
。我对代码进行了一些修改。我会相应地更新问题。在我发布答案后,我会尝试一下,至少在你修改代码的地方对代码进行注释。您的类名在DLL FindWoodow中仍然不正确:应该是:tmainhookTestForm抱歉,请查看我答案底部的编辑部分。一切都很好。尝试使用
WH\u MOUSE\u LL
(14)而不是
WH\u MOUSE