【问题标题】:How to detect the unknown object stealing a specific shortcut?如何检测窃取特定快捷方式的未知对象?
【发布时间】:2021-07-05 12:45:22
【问题描述】:

在一个非常复杂的 Delphi 10.4.2 VCL 应用程序中,一个未知的控件或组件似乎“窃取”了CTRL+A 快捷方式。为了检测窃取快捷方式的对象,我尝试使用TApplicationEvents.OnShortCut 事件处理程序:

procedure TformMain.ApplicationEvents1ShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  case Msg.CharCode of      
    VK_A:
      begin
        //CodeSite.Send('TformMain.ApplicationEvents1ShortCut: ', ???);
      end;
  end;
end;

这个事件处理程序可以用来检测“小偷”吗,或者你会建议哪种方法?

【问题讨论】:

  • 为什么不在所有 .PAS 文件中搜索文本 ctrlssCtrl
  • @AmigoJack:这将错过大量所有可能的情况,例如,当您有一个 TAction 并将其 Shortcut 设置为 Ctrl+A 时。它存储在 DFM 中(完全以数字形式)。
  • @AndreasRejbrand 没错:Action 的 CTRL+A 快捷方式在 DFM 中存储为 ShortCut = 16449

标签: delphi keyboard-shortcuts delphi-10.4-sydney


【解决方案1】:

实现快捷方式的方法有很多种,因此可能没有一种快速的方法可以解决所有问题。但以下内容应涵盖许多(如果不是大多数)情况。

您需要的所有背景知识都可以在 Peter below 的 A Key’s Odyssey 中找到。

首先,如果您知道某些代码是由于此快捷方式而执行的,您可以在此代码中放置一个断点,调用堆栈可能会告诉您所有您需要知道的信息。

例如,如果我创建一个新的 VCL 应用程序,添加一个 TActionList 和一个带有快捷键 Ctrl+TTAction 和一个 OnExecute 处理程序它调用CreateFrog 过程,我可以在这个过程中放置​​一个断点,我得到以下调用堆栈:

在这里,我们立即看到 CreateFrog 是由于名为 aTest 的操作和匹配的快捷方式而被调用的。事实上,如果你一直向下到TControl.WndProc(比如说),你甚至可以看到T84)键被按下了(CN_KEYDOWN = 48384):

如果你没有什么好地方放断点,你可以在TControl.WndProc中放一个条件断点,条件为(Message.Msg = CN_KEYDOWN) and (Message.WParam = 84)

然后,如果您运行应用程序并触发快捷方式,您将能够单步执行源代码并查看会发生什么。

【讨论】:

  • 小偷是被遗忘的TAction,快捷方式为CTRL+A
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多