如何检测盗用特定快捷方式的未知对象?

How to detect the unknown object stealing a specific shortcut?

在非常复杂的 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;

可以使用此事件处理程序来检测“小偷”吗,或者您建议使用哪种方法?

实现快捷方式的方法有很多种,因此可能没有一种可以包罗万象的快速方法。但以下应该涵盖许多(如果不是大多数)情况。

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

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

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

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

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

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