繁体   English   中英

在 Delphi Mdi 应用程序的父窗口中使用 KeyDown 事件

[英]Using KeyDown event in the parent window of a Delphi Mdi Application

即使子窗口具有焦点,如何让 KeyDown 事件在 Delphi (2007) MDI 应用程序父窗口中工作?

我想实现一个在 MDI 应用程序中显示帮助屏幕的快捷键 (F1),我已将 KeyDown 过程添加到 MDI 父窗口并在父窗口和子窗口中启用 KeyPreview,但它不起作用预期的。

如果我在Parents KeyDown 代码中放置一个断点,我可以看到它永远不会执行,即使没有打开子窗口。 但是如果我将相同的代码添加到子窗口,它就可以正常工作。

有没有办法让父窗口接收按键,即使子窗口有焦点,因为将代码添加到 25+ 表单接缝有点浪费?

这周我遇到了完全相同的问题! 我通过在主窗体上的 ActionManager 中创建一个操作来修复它。 此操作将打开帮助文件并将 F1 键设置为快捷方式。 它也适用于所有 MDI 子屏幕。

您可以使用本地(不需要全局) 键盘钩子 您还可以从一个单表单基类派生所有 MDI 子表单并在那里实现一次。 您会发现这种设计对于解决其他问题也很有用。

编辑

应用程序范围的热键/快捷方式也可以通过 TApplication.OnShortCut 事件实现。 http://delphi.about.com/od/adptips2004/a/bltip0904_3.htm

F1 已经是触发 TApplication.OnHelp 的标准帮助快捷方式。 那么也许您想使用 OnHelp 事件? 如果您使用 HelpFile、HelpContext、HelpType 和 HelpKeyword 属性,您甚至可能根本不需要实现任何代码。

即使子窗口具有焦点,如何让 KeyDown 事件在 Delphi (2007) MDI 应用程序父窗口中工作?

作为更通用的解决方案(对于 F1 以外的应用程序),我使用与此类似的代码在主窗体中捕获 keydown 事件。 无论如何,即使 MDI 子项处于活动状态,这也会获取所有键。 在这个例子中,我正在做与你想要做的相反的事情(我希望消息由我的子表单而不是主表单处理),但在父表单中捕获键的概念是相同的)。

Application.OnMessage := AppMessage;

procedure TMainForm.Appmessage(var Msg: TMsg; var Handled: Boolean);
var
  message: TWMKey;
begin
  If (msg.message = WM_KEYDOWN) and
     ( LoWord(msg.wparam) = VK_TAB ) and
     (GetKeyState( VK_CONTROL ) < 0 ) and
     Assigned( ActiveMDIChild ) then
  Begin
    Move( msg.message, message.msg, 3*sizeof(Cardinal));
    message.result := 0;
    Handled := ActiveMDIChild.IsShortcut( message );
  End;
end;

F1 帮助处理是内置在 Delphi 中的,因此您所要做的就是正确处理帮助消息。 这可能与为应用程序设置 helpfile 属性一样小。 您可以使用表单的帮助设置特定页面??? 特性。

基本上,只需使用提供的帮助系统,而无需使用 keydown。 这就是 Delphi - 你不必努力工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM