gpt4 book ai didi

c# - 尝试使用ProcessCmdKey在MDI父/子窗体和其他窗体中实现全局快捷键

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:10 25 4
gpt4 key购买 nike

我在我的 MDI 父窗体类中覆盖了 ProcessCmdKey() 并且在同一个类中有一些键盘快捷键调用方法。但我希望让这些热键以父/子形式和其他形式工作。现在的情况是当专注于其他形式(常规形式,而不是 MDI)时,ProcessCmdKey() 不再捕获键盘。我应该把 ProcessCmdKey() 放在哪个类中以及让它工作的任何东西?谢谢!

namespace myNamespace
{
public class MDIParent : System.Windows.Forms.Form
{

public bool NextTab(){...}
public bool PreviousTab(){...}

protected override bool ProcessCmdKey(ref Message message, Keys keys)
{
switch (keys)
{
case Keys.Control | Keys.Tab:
NextTab();
return true;

case Keys.Control | Keys.Shift | Keys.Tab:
PreviousTab();
return true;
}
return base.ProcessCmdKey(ref message, keys);
}
}

public class mySecondForm : System.Windows.Forms.Form
{
...
}
}

最佳答案

您可以使用实现的 ProcessCmdKey 处理程序定义一个“基本”表单,然后创建所有其他表单:MDI 父级、MDI 父级的子窗口以及您创建的任何“独立”表单(即不是子级) MDI 窗体的)继承自“基本窗体”。只需确保在您希望成为 MDI 的窗体上设置了 IsMdiContainer 属性,并且您添加到 MDI 窗体的子窗口不是 TopLevel 并且将它们的父窗口设置为 MDI 窗体。

那么问题是,你想在哪里处理由你启用的组合键触发的事件,因为......如果你定义由基​​本表单中的捕获组合键触发的方法......每个从基础 Form 继承的 Form 将在它们自己的上下文中执行它们。

如果您想在应用程序范围内处理捕获的组合键,那么可以实现一个静态公共(public)类,其中的组合键处理程序定义为静态方法。或者,由于您可能想知道从哪个表单发出的特殊组合键,只需将调用表单的指针传递给静态处理程序。

因此,您在基本表单中 ProcessCmdKey 覆盖中的控件 + Tab 处理程序可能如下所示:

    // in ProcessCmdKey override in base Form
case Keys.Control | Keys.Tab:
KeyHandler.NextTabHandler(this);
return true;

你的静态类可能看起来像这样:

public static class KeyHandler
{
public static void NextTabHandler(Form theCallingForm)
{
Console.WriteLine("called from : " + theCallingForm.Text + " : ActiveControl : " + theCallingForm.ActiveControl.Name);

if (theCallingForm is MDIForm)
{
// handle Next Tab on MDIForm control
}
else if (theCallingForm is childForm)
{
// handle Next Tab on ChildForm control
}
else
{
if(theCallingForm is independentForm)
{
// handle Next Tab on "independent Form" control
}
}
}
}

正如您在上面的代码中看到的,您可以使用调用 Form 的 ActiveControl 属性来了解给定类型的 Form 上的哪个控件获得了组合键。

当然,如果您不想像这样“全局”处理组合键,只需根据需要在其他表单中插入您的 ProcessCmdKey 覆盖,并且不要让它们从基本表单继承.

在“应用程序范围内”处理关键事件可能是也可能不是您特定解决方案的最佳策略,但它是一个可行的策略。最好的,

关于c# - 尝试使用ProcessCmdKey在MDI父/子窗体和其他窗体中实现全局快捷键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1704953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com