2009-04-02 15 views

答えて

13

は、私はあなたがGetKeyboardState API関数を使用するときに最高のオフになると思います。

[DllImport ("user32.dll")] 
public static extern int GetKeyboardState(byte[] keystate); 


private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    byte[] keys = new byte[256]; 

    GetKeyboardState (keys); 

    if ((keys[(int)Keys.Up] & keys[(int)Keys.Right] & 128) == 128) 
    { 
     Console.WriteLine ("Up Arrow key and Right Arrow key down."); 
    } 
} 

KeyDownイベントでは、キーボードの「状態」を尋ねるだけです。 GetKeyboardStateは指定したバイト配列に値を設定し、この配列内のすべての要素はキーの状態を表します。

各仮想キーコードの数値を使用して各キー数値にアクセスできます。そのキーのバイトが129または128に設定されている場合、キーが押されている(押されている)ことを意味します。そのキーの値が1または0の場合、キーは押されていません(押されていない)。値1は、トグルされたキー状態(例えば、キャップロック状態)を意味します。

詳細はMicrosoft documentation for GetKeyboardStateを参照してください。

1

ええと、キーダウンごとに別々のイベントがありますか?

矢印ごとに4つのブール値を作成できます。それが押されたら、その矢印の論理値をtrueに設定します。解放された場合は、その矢印のbooleanをfalseに設定します。

次に、上と下のブール値が真であるかどうかを確認し、次にあなたの行動を行います。 Form1を想定し

14

あなたのために少しの概念実証コードは、label1含まれています

private List<Keys> pressedKeys = new List<Keys>(); 

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    pressedKeys.Add(e.KeyCode); 

    printPressedKeys(); 
} 

private void Form1_KeyUp(object sender, KeyEventArgs e) 
{ 
    pressedKeys.Remove(e.KeyCode); 

    printPressedKeys(); 
} 

private void printPressedKeys() 
{ 
    label1.Text = string.Empty; 
    foreach (var key in pressedKeys) 
    { 
     label1.Text += key.ToString() + Environment.NewLine; 
    } 
} 
+0

@JamesBarrassはあなたが持つことができるアプローチにはCtrl +文字X + Yの手紙:http://stackoverflow.com/questions/11157868/capture-ctrl-multiple-key-downs –

0

キーダウンがどのように発生するかを確認するには、SPY ++を使用します。基本的に、複数の矢印キーが同時に押された場合、ヒットした最初のキーでイベントが発生し、2番目のキーにヒットした場合は起動し、最初のイベントのイベントは表示されなくなります。彼らがリリースされると、彼らのキーアップイベントが表示されます。私はあなたが早期に提案されたブールフラグを実装することをお勧めします。

4

Keyboard.IsKeyDown(Key.YourKey) 

を使用すると、複数のkeydownsを処理することができます。

+1

こんにちは、あなたはどのようなライブラリのキーボードから来るのか詳しく説明できますか? – randfur

+2

System.Windows.Input.KeyBoard – Andreas

+0

WPFに適しています。 (アセンブリの言い方をすれば、PresentationCore.dllから来ます) –

0

便利なマネージラッパーを提供するマネージライブラリMouseKeyHook as nugetがあります。 Source code on github

最近、ショートカット、キーの組み合わせおよびシーケンスの検出のサポートが追加されました。

Hook.AppEvents().OnCombination(new Dictionary<Combination, Action> 
{ 
    {Combination.FromString("Left"), GoWest}, 
    {Combination.FromString("Left+Up"), GoNorthWest}, 
    {Combination.FromString("Up+Left"), GoNorthWest}, 
    {Combination.FromString("Up"), GoNorth}, 
    {Combination.FromString("Up+Right"), GoNorthEast}, 
    {Combination.FromString("Right+Up"), GoNorthEast}, 
}); 

詳細については以下を参照してください:ここでは矢印に対処するための使用例があるDetecting Key Combinations and Seuqnces

関連する問題