Windows Formsフォームで作業するときに、C#で複数のキーダウンをキャプチャするにはどうすればよいですか?C#で複数のキーダウンをキャプチャする
私はちょうど上向き矢印と右向き矢印の両方を同時に得ることができません。
Windows Formsフォームで作業するときに、C#で複数のキーダウンをキャプチャするにはどうすればよいですか?C#で複数のキーダウンをキャプチャする
私はちょうど上向き矢印と右向き矢印の両方を同時に得ることができません。
は、私はあなたが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を参照してください。
ええと、キーダウンごとに別々のイベントがありますか?
矢印ごとに4つのブール値を作成できます。それが押されたら、その矢印の論理値をtrueに設定します。解放された場合は、その矢印のbooleanをfalseに設定します。
次に、上と下のブール値が真であるかどうかを確認し、次にあなたの行動を行います。 Form1
を想定し
あなたのために少しの概念実証コードは、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;
}
}
キーダウンがどのように発生するかを確認するには、SPY ++を使用します。基本的に、複数の矢印キーが同時に押された場合、ヒットした最初のキーでイベントが発生し、2番目のキーにヒットした場合は起動し、最初のイベントのイベントは表示されなくなります。彼らがリリースされると、彼らのキーアップイベントが表示されます。私はあなたが早期に提案されたブールフラグを実装することをお勧めします。
便利なマネージラッパーを提供するマネージライブラリ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
@JamesBarrassはあなたが持つことができるアプローチにはCtrl +文字X + Yの手紙:http://stackoverflow.com/questions/11157868/capture-ctrl-multiple-key-downs –