13

C# フォームでCtrl+ Alt+ K+キーをキャプチャするにはどうすればよいですか? Pありがとう

4

5 に答える 5

16

それは和音であり、和音の最初のキーストロークを見たことを記憶せずにそれを検出することはできません. これは機能します:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    private bool prefixSeen;

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (prefixSeen) {
            if (keyData == (Keys.Alt | Keys.Control | Keys.P)) {
                MessageBox.Show("Got it!");
            }
            prefixSeen = false;
            return true;
        }
        if (keyData == (Keys.Alt | Keys.Control | Keys.K)) {
            prefixSeen = true;
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}
于 2010-07-14T07:58:29.560 に答える
8

できるかどうかわかりません。ただし、できることは、Visual Studio が行う方法です。Ctrl+ KC. _ 最初にCtrl+を押しK、次に押したままCtrlを押しCます。あなたの場合、Ctrl++ 、Alt.KP

Ctrl他の回答で行ったように、最初に+ Alt+のみをチェックしてから、 + +が押されたKことを示すメンバー変数/フラグを設定できます。をチェックするのと同じメソッドで、 をチェックできます。設定したばかりのフラグが true に設定されている場合は、必要なことを何でも行います。それ以外の場合は、フラグを false に戻します。CtrlAltKKP

大まかな擬似コード:

private bool m_bCtrlAltKPressed = false;

public void KeyDown() {
  if (Ctrl+Alt+K)
  {
    m_bCtrlAltKPressed = true;
  }
  else if (Ctrl+Alt+P && m_bCtrlAltKPressed) {
    //do stuff
  }
  else {
    m_bCtrlAltKPressed = false;
  }
}

それが十分に明確であることを願っています。

于 2010-07-14T07:45:48.870 に答える
2

組み合わせのキーの 1 つが押されたときに、GetKeyStateを使用して他のキーの状態を取得できます。フォームの例を次に示します。

using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace DetectKeyChord
{
    public partial class Form1 : Form
    {
        private const int WM_KEYDOWN = 0x100;
        private const int KEY_PRESSED = 0x80;

        public Form1()
        {
            InitializeComponent();
        }

        public void ShortcutAction()
        {
            MessageBox.Show("Ctrl+Alt+K+P has been pressed.");
        }

        private bool IsKeyDown(Keys key)
        {
            return (NativeMethods.GetKeyState(key) & KEY_PRESSED) == KEY_PRESSED;
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_KEYDOWN)
            {
                //If any of the keys in the chord have been pressed, check to see if
                //the entire chord is down.
                if (new[] { Keys.P, Keys.K, Keys.ControlKey, Keys.Menu }.Contains((Keys)m.WParam))
                {
                    if (IsKeyDown(Keys.ControlKey) && IsKeyDown(Keys.Menu) && IsKeyDown(Keys.K) && IsKeyDown(Keys.P))
                    {
                        this.ShortcutAction();
                    }
                }
            }
            base.WndProc(ref m);
        }
    }

    public static class NativeMethods
    {
        [DllImport("USER32.dll")]
        public static extern short GetKeyState(Keys nVirtKey);
    }
}
于 2015-12-15T04:08:20.087 に答える
2

MessageFiltersこの場合に役立ちます。

    public class KeystrokMessageFilter : System.Windows.Forms.IMessageFilter
    {
        public KeystrokMessageFilter() { }

        #region Implementation of IMessageFilter

        public bool PreFilterMessage(ref Message m)
        {
            if ((m.Msg == 256 /*0x0100*/))
            {
                switch (((int)m.WParam) | ((int)Control.ModifierKeys))
                {
                    case (int)(Keys.Control | Keys.Alt | Keys.K):
                        MessageBox.Show("You pressed ctrl + alt + k");
                        break;
                    //This does not work. It seems you can only check single character along with CTRL and ALT.
                    //case (int)(Keys.Control | Keys.Alt | Keys.K | Keys.P):
                    //    MessageBox.Show("You pressed ctrl + alt + k + p");
                    //    break;
                    case (int)(Keys.Control | Keys.C): MessageBox.Show("You pressed ctrl+c");
                        break;
                    case (int)(Keys.Control | Keys.V): MessageBox.Show("You pressed ctrl+v");
                        break;
                    case (int)Keys.Up: MessageBox.Show("You pressed up");
                        break;
                }
            }
            return false;
        }

        #endregion


    }

C# WindowsForm で、キーストロークと組み合わせをキャプチャするために MessageFilter を登録します。

public partial class Form1 : Form
{
    KeystrokMessageFilter keyStrokeMessageFilter = new KeystrokMessageFilter();

    public Form1()
    {
        InitializeComponent();
    }       
    private void Form1_Load(object sender, EventArgs e)
    {
        Application.AddMessageFilter(keyStrokeMessageFilter);
    }
}

どういうわけかCtrl++しか検出しませんAltKMessageFilter コードのコメントを読んでください。

于 2010-07-14T07:43:18.977 に答える
1

C# でのホットキーの設定に関するこの素晴らしいブログ投稿を参照してください

ここにすべてを説明する良い記事もあります

于 2010-07-14T07:22:14.530 に答える