0

我的申请有几种形式。我想要做的是能够使用一对预定义的键(比如 Keys.A + Keys.B)在它们之间(并且在它们之间)切换,就像ALT + TAB对 Windows 所做的那样(窗口显示在前台)。我尝试获取表单列表,然后以编程方式调用 Alt + Tab,但是,正如预期的那样,这允许在所有打开的窗口之间切换,而不仅仅是属于应用程序的窗口。

谢谢你的帮助!

4

2 回答 2

1

您可以实现IMessageFilter并将其添加到您的Application,然后全局处理您的应用程序的消息。

这是你如何做到的。

public class MessageFilter : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        switch ((WindowsMessage)m.Msg)
        {
            case WindowsMessage.WM_KEYDOWN:
            case WindowsMessage.WM_SYSKEYDOWN:
                {
                    if (((int)m.WParam | ((int)Control.ModifierKeys)) != 0)
                    {
                        Keys keyData = (Keys)(int)m.WParam;

                        var activeForm = Form.ActiveForm;
                        var forms = Application.OpenForms.Cast<Form>().Where(x => x.Visible).ToArray();
                        int active = Array.IndexOf(forms, activeForm);
                        if (keyData == Keys.A)
                        {
                            int next = (active + 1)%forms.Length;
                            forms[next].Activate();//Activate next
                        }
                        else if (keyData == Keys.B)
                        {
                            int prev = (active - 1) % forms.Length;
                            forms[prev].Activate();//Activate previous
                        }

                    break;
                }
        }

        return false;
    }
}

class MainForm : Form
{
    protected override void OnLoad(EventArgs e)
    {
        Application.AddMessageFilter(new MessageFilter());
    }
}

您可以在此处找到WindowsMessage枚举。

于 2014-01-13T07:20:19.253 回答
0

如果您打开了多个窗口(窗体)并且它们具有正常的标题或属于 MDI,那么Ctrl+F6是在它们之间切换的标准快捷方式。

否则,制作热键以在表单之间切换是非常简单的任务:

  • 所有表格都必须有KeyPreview = trueKeyDown| KeyUp事件;
  • 所有表单实例都必须是可访问的(一种可能性是Application.OpenForms);
  • 按下热键时,找到下一个/上一个窗口并使其处于活动状态。
于 2014-01-13T10:11:37.483 回答