web-dev-qa-db-ja.com

KeyDown:複数のキーを認識する

KeyDownでどのように判断できますか CtrlUp 押された。

private void listView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up)
    {
        //do stuff
    }
}    

同じ秒で両方のキーが正確に押されることはないため、機能しません。あなたはいつも最初に Ctrl そして他の...

33
Kai

次のようにKeyEventArgsの修飾子を確認できます。

private void listView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Control)
    {
        //do stuff
    }
}  

MSDNリファレンス

28
Garry Shutler

KeyEventArgsのMSDNページ から:

if (e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
{
    //Do stuff...
}
13
Matt Hamilton

KeyEventArgsにはプロパティがあります Ctrl、 Alt そして Shift これらのボタンが押されているかどうかを示します。

7
IordanTanev

Keyboardオブジェクトを使用して、IsKeyDownプロパティを検出することができます。また、ブラウザのショートカットを上書きしたくない場合は、Handledプロパティをtrueに設定できます。ただし、ブラウザのショートカットを上書きする場合は混乱を招く可能性があるため注意してください。

private void Page_KeyDown(object sender, KeyEventArgs e)
{
    // If leftCtrl + T is pressed autofill username
    if (Keyboard.IsKeyDown(Key.T) && Keyboard.IsKeyDown(Key.LeftCtrl))
    {
        txtUser.Text = "My AutoFilled UserName";
        e.Handled = true;
    }
}
5
zulumojo
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Up && Keyboard.IsKeyDown(Key.LeftCtrl))
    {
         //do stuff
    }
}

このコードは、最初にLeftCtrlを押し、次に「UP」を押した場合にのみ機能します。順序に重要性がない場合は、次のことをお勧めします。

if ((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))&& Keyboard.IsKeyDown(Key.Z))
{
    //do stuff
}

その場合、両方のCtrlが考慮され、順序は重要ではありません。

3
Siegfried.V

ModifierKeysプロパティを使用できます。

if (e.KeyCode == Keys.Up && (ModifierKeys & Keys.Control) == Keys.Control)
{
    // CTRL + UP was pressed
}

ModifierKeys値は値の組み合わせになる可能性があるため、それを検出する場合は、 CTRL の状態に関係なく押された SHIFT または ALT キーの場合、上記のサンプルのようにビットごとの比較を実行する必要があります。他の修飾子が押されていないことを確認する場合は、代わりに同等性を確認する必要があります。

if (e.KeyCode == Keys.Up && ModifierKeys == Keys.Control)
{
    // CTRL + UP was pressed
}
2
Fredrik Mörk

以下のコードをテストしました。できます...

private void listView1_KeyDown(object sender, KeyEventArgs e)
    {
        if ((int) e.KeyData == (int) Keys.Control + (int) Keys.Up)
        {
            MessageBox.Show("Ctrl + Up pressed...");
        }
    }
1
Moseyza

[Alt] [Right]を検出しようとしたときに最終的に必要なヒントを見つけるのに時間がかかりました。ここで見つけました: https://social.msdn.Microsoft.com/Forums/vstudio/en-US/4355ab9a-9214-4fe1-87ea-b32dfc22946c/issue-with-alt-key-and-key -down-event?forum = wpf

私が使用するShortcutヘルパークラスでは、次のように要約されます。

public Shortcut(KeyEventArgs e) : this(e.Key == System.Windows.Input.Key.System ? e.SystemKey : e.Key, Keyboard.Modifiers, false) { }

public Shortcut(Key key, ModifierKeys modifiers, bool createDisplayString)
{
    ...
} 

元の値を「再マッピング」した後(e.Key == System.Windows.Input.Key.System ? e.SystemKey : e.Key part)、さらに処理を続行できます。

0
mike

これは確実に機能します。 KeyUpではなく、keyDownイベントを処理するように注意してください。

private void mainForm_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
        {
             //insert here
        }
    }

私にとっては、keyDownは機能せず、keyUpは代わりに同じコードで機能しました。

理由はわかりませんが、何らかのキーを押した直後にkeyDownイベントが発生するようです。 ctrl キーなので、押した場合 ctrl+Up あなたが押します ctrl 前のキー UP キーを押すと、他のキーを押す前にイベントが発生し、2番目のキーを押すとイベントが再びトリガーされます。

KeyUpを使用している間、キーを放すまでイベントはトリガーされません。 ctrl、2番目のキーを押すと、1つのイベントがトリガーされます。

0
A. Harkous