キーボードのキーが現在押されているかどうかを検出するにはどうすればよいですか? キーが何であるかには興味がありません。キーがまだ押されているかどうかを知りたいだけです。
if (Keyboard.IsKeyDown(Key.ANYKEY??)
{
}
public static IEnumerable<Key> KeysDown()
{
foreach (Key key in Enum.GetValues(typeof(Key)))
{
if (Keyboard.IsKeyDown(key))
yield return key;
}
}
その後、次のことができます。
if(KeysDown().Any()) //...
アプリケーションでのみ押されたキーを検出したい場合 (WPF ウィンドウがアクティブになっている場合)、KeyDown
以下のように追加します。
public MainWindow()
{
InitializeComponent();
this.KeyDown += new KeyEventHandler(MainWindow_KeyDown);
}
void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show("You pressed a keyboard key.");
}
WPFウィンドウがアクティブでなくてもキーが押されたことを検出したい場合は、少し難しいですが可能です。RegisterHotKey
(システム全体のホット キーを定義する) およびUnregisterHotKey
Windows API からお勧めします。pinvoke.netまたはこれらのチュートリアルから C# でこれらを使用してみてください。
これはMicrosoft Forumsのサンプルです。
Virtual-Key Codesを使用します。私が明確であり、あなたが私の答えを理解してくれることを願っています.
System.Windows.Input.Key
列挙値を反復処理します。
public static bool IsAnyKeyDown()
{
var values = Enum.GetValues(typeof(Key));
foreach (var v in values)
if (((Key)v) != Key.None && Keyboard.IsKeyDown((Key)v)
return true;
return false;
}
ここで良い答え...を使用して、すべてのキーステートのセットを一度に取得しますGetKeyboardState()
。
上記は、キーボードのライブ状態をチェックしています。
キーボードの状態を追跡するためにイベントを KeyDown/KeyUp イベントにフックすることに依存している場合、これはそれほど正確ではない可能性があります。
これは、これらの KeyDown/KeyUp メッセージの処理とディスパッチをメッセージ ポンピングに依存しているためです。実際のキーボードの状態が再び変化した後に配信される可能性があります。
また、キーボードの状態に関心のあるコードが実行されている場合 (通常は UI スレッドで)、KeyDown または KeyUp は UI スレッドでもディスパッチされるため、中断することはできません... .だから、GetKeyBoardState()
または を使用するKeyboard.IsKeyDown
必要があります。
(上記は、あなたがライブ状態を望んでいて気にかけていることを前提としています)