繁体   English   中英

以所有者形式捕获按键组合的最佳方法是什么?

[英]What is the best way to trap key press combinations in owner form?

我有一个具有多个子窗体的全局父窗体,并且希望有一个快捷键组合供用户在它们之间循环。 我希望这种逻辑由父表单处理,以便子表单保持与此无关。

事实证明,这种显然常见的场景(例如,在Visual Studio中切换活动文档,在浏览器中切换活动标签等)很难实现。 到目前为止,我发现这样做的唯一方法是使用全局挂钩或热键。 这种方法的问题在于,由于该设置在系统范围内应用,因此它们会阻止其他应用程序使用相同的热键。

对于所有者表单,即使子表单处于焦点状态,最好的方法是收听特定的按键吗?

好的,我找到了一种使用消息过滤器的简单方法。 事实证明,您可以使用IMessageFilter接口向Application注册全局消息过滤器。 例如:

class HotKeyMessageFilter : IMessageFilter
{
    const int WM_KEYDOWN = 0x100;

    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_KEYDOWN)
        {
            var keyCode = (Keys)m.WParam;
            if (keyCode == Keys.Tab && Form.ModifierKeys.HasFlag(Keys.Control))
            {
                if (Form.ModifierKeys.HasFlag(Keys.Shift)) CycleActiveForm(-1);
                else CycleActiveForm(1);
            }
        }

        return false;
    }
}

该消息过滤器将侦听特定的组合键,然后调用一些静态或类方法以在所有打开的窗口之间跳转。 您可以将要在其间循环的特定窗口句柄作为参数传递给消息过滤器,因为它只是普通的类。

您可以随时使用以下内容在应用程序中注册过滤器:

Application.AddMessageFilter(filter);

并使用以下命令将其删除:

Application.RemoveMessageFilter(filter);

如果在Winforms中使用MDI表单,则Ctrl + Tab快捷键将自动注册以更改窗口。 如果您尝试捕获其他按键组合,请在MDI表单上将KeyPreview设置为true并在那里处理按键。

暂无
暂无

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

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