【问题标题】:How to catch any mouseclick in my application如何在我的应用程序中捕捉任何鼠标点击
【发布时间】:2021-01-31 22:18:28
【问题描述】:

Delphi 10 在我的 (windows-) 应用程序中获得每次鼠标点击的最佳方法是什么? 我实际上想实现触摸声音,但OnGesture 只返回手势(惊喜),所以我想去任何点击。我不想捕获每个 VCL OnClick 并希望获得一个整体的钩子/触发器/事件

【问题讨论】:

  • 挂钩应用对象的OnMessage事件
  • 要添加到 David 的评论中,最简单的方法是在主窗体上放置一个 TApplicationEvents 组件。

标签: delphi delphi-10.3-rio


【解决方案1】:

@David Heffernan 是对的,你可以使用消息事件
如果你想在其他应用程序中获取所有事件,你应该使用钩子。
这是通过消息(WM_LBUTTONDOWNWM_LBUTTONUP)
覆盖 application.OnMessage

的一些功能
application.OnMessage := yourOnMessage 

覆盖 WndProc(var message:TMessage);

procedure TForm1.WndProc(var message: TMessage);
begin
  inherited;
  if message.Msg = WM_LBUTTONDOWN then
    ShowMessage('down');

end;

只听 WM_LBUTTONDOWN

procedure Wmme(var message:TMessage);message WM_LBUTTONDOWN;
procedure TForm1.WndProc(var message: TMessage);
begin
  inherited;
  if message.Msg = WM_LBUTTONDOWN then
    ShowMessage('down');

end;

【讨论】:

  • 这里有几个问题:(1)你不能“覆盖”Application.OnMessage;不过,您可以分配自己的处理程序。 (2) 您的第二种方法TForm1.WndProc 将仅检测对TForm1 本身的点击——不会检测此表单上的任何子控件,也不会检测任何其他表单上的点击。 (3)第三种方法......好吧,这里甚至很不清楚你的意思。可能您打算使用消息过程而不是覆盖WndProc,但忘记了旧签名。此外,您的 A 可以通过给出第一种方法的具体示例来改进,并指出使用它可能会更好......
  • ...TApplicationEvents。那么项目的不同部分就不需要竞争同一个全局变量了。
猜你喜欢
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
相关资源
最近更新 更多