在Delphi Mdi应用程序的父窗口中使用KeyDown事件
如何使KeyDown事件在Delphi 2007 MDI应用程序父窗口中工作,即使子窗口具有焦点 我想实现一个快捷键F1,在MDI应用程序中显示帮助屏幕。我已将向下键过程添加到MDI父窗口,并在父窗口和子窗口中启用了KeyPreview,但它无法按预期工作 如果我在Parents KeyDown代码中设置一个断点,我可以看到它从未执行过,即使它没有打开子窗口。但是,如果我向子窗口添加相同的代码,它就可以正常工作在Delphi Mdi应用程序的父窗口中使用KeyDown事件,delphi,mdi,keypress,Delphi,Mdi,Keypress,如何使KeyDown事件在Delphi 2007 MDI应用程序父窗口中工作,即使子窗口具有焦点 我想实现一个快捷键F1,在MDI应用程序中显示帮助屏幕。我已将向下键过程添加到MDI父窗口,并在父窗口和子窗口中启用了KeyPreview,但它无法按预期工作 如果我在Parents KeyDown代码中设置一个断点,我可以看到它从未执行过,即使它没有打开子窗口。但是,如果我向子窗口添加相同的代码,它就可以正常工作 有没有办法让父窗口接收按键,即使子窗口有焦点,因为将代码添加到25+窗体接缝有点浪费
有没有办法让父窗口接收按键,即使子窗口有焦点,因为将代码添加到25+窗体接缝有点浪费?您可以使用本地全局按钮,这是不需要的。您还可以从单表单基类派生所有MDI子表单,并在那里实现一次。您会发现,这种设计对于解决其他问题也很方便 编辑 应用程序范围的热键/快捷键也可以通过TApplication.OnShortCut事件实现。看
F1已经是触发TApplication.OnHelp的标准帮助快捷方式。那么也许你想使用OnHelp事件?如果您使用HelpFile、HelpContext、HelpType和HelpKeyword属性,您可能根本不需要实现任何代码。您可以使用本地全局属性,而不需要。您还可以从单表单基类派生所有MDI子表单,并在那里实现一次。您会发现,这种设计对于解决其他问题也很方便 编辑 应用程序范围的热键/快捷键也可以通过TApplication.OnShortCut事件实现。看
F1已经是触发TApplication.OnHelp的标准帮助快捷方式。那么也许你想使用OnHelp事件?如果您使用HelpFile、HelpContext、HelpType和HelpKeyword属性,您可能根本不需要实现任何代码。F1帮助处理内置于Delphi中,因此您所要做的就是正确处理帮助消息。这可能只是设置应用程序的helpfile属性。您可以使用表单的帮助设置特定页面???财产
基本上,只需使用提供的帮助系统,忘记按键。这是Delphi-您不必努力工作。F1帮助处理内置于Delphi中,因此您所要做的就是正确处理帮助消息。这可能只是设置应用程序的helpfile属性。您可以使用表单的帮助设置特定页面???财产
基本上,只需使用提供的帮助系统,忘记按键。这是德尔福-你不必努力工作。本周我遇到了完全相同的问题!我通过在主窗体上的ActionManager中创建一个操作修复了它。此操作将打开帮助文件并将F1键设置为快捷方式。它也适用于所有MDI子屏幕。本周我遇到了完全相同的问题!我通过在主窗体上的ActionManager中创建一个操作修复了它。此操作将打开帮助文件并将F1键设置为快捷方式。它也适用于所有MDI子屏幕 如何使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;
如何使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;
很好的建议。我一直为MDI儿童使用基类。这样做感觉很对。很好的建议。我一直为MDI儿童使用基类。我觉得这样做是对的。这肯定会奏效;此外,无论如何,使用战术专家或战术管理者来做这类事情是正确的方法!你知道这是怎么回事吗?TAction是否实现了本地键盘挂钩?这肯定会起作用;此外,无论如何,使用战术专家或战术管理者来做这类事情是正确的方法!你知道这是怎么回事吗?TAction是否实现本地键盘挂钩?