Как получить комбинацию ключей c#

Как я могу получить Ctrl +, Высокий звук + K + P включает форму C#?спасибо

10
задан this. __curious_geek 14 July 2010 в 07:43
поделиться

4 ответа

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 + Alt + K . Пожалуйста, прочтите комментарий в коде MessageFilter.

2
ответ дан 3 December 2019 в 16:51
поделиться

Я не уверен, что вы можете. Однако вы можете сделать это так, как это делает Visual Studio. В ней есть такие сочетания клавиш, как Ctrl + K, C. Сначала вы нажимаете Ctrl+K, затем удерживаете Ctrl и нажимаете C. В вашем случае можно проверить Ctrl+Alt+K,P.

Вы можете сначала проверить наличие только Ctrl+Alt+K, как это сделано в других ответах, затем установить переменную-член/флаг, указывающий на то, что Ctrl+Alt+K был нажат. В том же методе, где вы проверяете наличие K, вы можете проверить наличие P, и если флаг, который вы только что установили, был установлен в true, сделайте все, что вам нужно. В противном случае установите флаг обратно в false.

Грубый псевдокод:

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;
  }
}

Надеюсь, это достаточно понятно.

8
ответ дан 3 December 2019 в 16:51
поделиться

Это аккорд, вы не можете распознать его, не запомнив, увидев первое нажатие клавиши аккорда. Это работает:

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);
    }
}
12
ответ дан 3 December 2019 в 16:51
поделиться

Посмотрите эту замечательную статью в блоге о настройке горячих клавиш в c#

Есть также хорошая статья, которая объясняет все это здесь

1
ответ дан 3 December 2019 в 16:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: