私はC#で書かれた簡単なコンソールアプリケーションを持っています。矢印キーの押下を検出できるようにしたいので、ユーザーが操縦できるようにすることができます。コンソールアプリでkeydown/keyupイベントを検出するにはどうすればよいですか?C#コンソールアプリケーション用のキー入力
私のすべてのグーグルがWindows Formsについての情報をもたらしました。私はGUIを持っていません。これは、コンソールアプリケーションです(シリアルポート経由でロボットを制御するため)。
私はこれらのイベントを処理するために書かれた機能を持っていますが、私は実際にイベントを受け取るために登録する方法が分からない:
private void myKeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Left:
...
case Keys.Right:
...
case Keys.Up:
...
}
}
private void myKeyUp(object sender, KeyEventArgs e)
{
... pretty much the same as myKeyDown
}
これはおそらく、本当に基本的な質問ですが、私はC#にかなり新しいですよ私はこれまでにこのような入力をする必要はありませんでした。
更新:多くは私がSystem.Console.ReadKey(true).Key
を使用することを示唆しています。これは役に立たないでしょう。キーを押した瞬間を知る必要があります。同時に、複数のキーを同時に押さえることができます。また、ReadKeyはブロッキングコールです。つまり、プログラムが停止してキーが押されるのを待ちます。
更新:これを実行する実行可能な唯一の方法は、Windowsフォームを使用することです。ヘッドレスシステムでは使用できないので、これは面倒です。キーボード入力を受け取るためにForm GUIを要求するのは...愚かです。
しかし、とにかく後世のために、私の解決策です。あなたがキーを押した場合、KeyDownイベントが何度も呼び出され、(あなたがそれを解放するとき)keyUpイベントは一度だけ呼び出されること
private void Form1_Load(object sender, EventArgs e)
{
try
{
this.KeyDown += new KeyEventHandler(Form1_KeyDown);
this.KeyUp += new KeyEventHandler(Form1_KeyUp);
}
catch (Exception exc)
{
...
}
}
void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
// handle up/down/left/right
case Keys.Up:
case Keys.Left:
case Keys.Right:
case Keys.Down:
default: return; // ignore other keys
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
// undo what was done by KeyDown
}
注:私は私の.slnで新しいフォームプロジェクトを作成しました。したがって、KeyDownの繰り返しの呼び出しを適切に処理する必要があります。ちょうどあなたのケースのための
別のスレッドでReadKeyを呼び出すことができます。回転スレッドの提案を参照してください。それはkeyup/keydownのものには言及しませんが。 – Rushyo