如何检测窃取特定快捷方式的未知对象?
在一个非常复杂的 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 Beyond 的A Key's Odyssey 中找到。
首先,如果您知道由于此快捷方式执行了某些代码,则可以在此代码中放置一个断点,调用堆栈可能会告诉您所有需要知道的信息。
例如,如果我创建一个新的 VCL 应用程序,添加一个TActionList, 和一个TAction带有快捷方式Ctrl+T和一个OnExecute调用该CreateFrog过程的处理程序,我可以在这个过程中放置一个断点,我得到以下调用堆栈:
在这里,我们立即看到CreateFrog由于以aTest匹配的快捷方式命名的操作而调用了它。事实上,如果你一直向下到TControl.WndProc(比如说),你甚至可以看到T( 84) 键被按下 ( CN_KEYDOWN = 48384):
如果你没有任何好的地方放一个断点,你可以把一个条件断点在TControl.WndProc与条件(Message.Msg = CN_KEYDOWN) and (Message.WParam = 84):
然后,如果您运行应用程序并触发快捷方式,您将能够单步执行源代码并查看会发生什么。