9

キーボードのキーが現在押されているかどうかを検出するにはどうすればよいですか? キーが何であるかには興味がありません。キーがまだ押されているかどうかを知りたいだけです。

if (Keyboard.IsKeyDown(Key.ANYKEY??)
{

}
4

4 に答える 4

12
public static IEnumerable<Key> KeysDown()
{
    foreach (Key key in Enum.GetValues(typeof(Key)))
    {
        if (Keyboard.IsKeyDown(key))
            yield return key;
    }
}

その後、次のことができます。

if(KeysDown().Any()) //...
于 2012-08-22T15:29:37.247 に答える
5

アプリケーションでのみ押されたキーを検出したい場合 (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(システム全体のホット キーを定義する) およびUnregisterHotKeyWindows API からお勧めします。pinvoke.netまたはこれらのチュートリアルから C# でこれらを使用してみてください。

これはMicrosoft Forumsのサンプルです。

Virtual-Key Codesを使用します。私が明確であり、あなたが私の答えを理解してくれることを願っています.

于 2012-08-22T15:35:49.420 に答える
2

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;
}
于 2012-08-22T15:25:55.500 に答える
1

ここで良い答え...を使用して、すべてのキーステートのセットを一度に取得しますGetKeyboardState()

上記は、キーボードのライブ状態をチェックしています。

キーボードの状態を追跡するためにイベントを KeyDown/KeyUp イベントにフックすることに依存している場合、これはそれほど正確ではない可能性があります。

これは、これらの KeyDown/KeyUp メッセージの処理とディスパッチをメッセージ ポンピングに依存しているためです。実際のキーボードの状態が再び変化した後に配信される可能性があります。

また、キーボードの状態に関心のあるコードが実行されている場合 (通常は UI スレッドで)、KeyDown または KeyUp は UI スレッドでもディスパッチされるため、中断することはできません... .だから、GetKeyBoardState()または を使用するKeyboard.IsKeyDown必要があります。

(上記は、あなたがライブ状態を望んでいて気にかけていることを前提としています)

于 2012-08-22T15:26:02.317 に答える