0

私のアプリケーションにはいくつかのフォームがあります。私がやりたいことは、Windows でALT + TABが行うのと同じように、定義済みのキーのペア (Keys.A + Keys.B など) を使用して、それらの間(およびそれらの間のみ) を切り替えることができるようにすることです (ウィンドウはフォアグラウンドで表示されます) 。 )。フォームのリストを取得してから、プログラムで 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 に答える