さて、基本的にはキーボード テキストを取得できるようにしたいと考えています。テキストフィールドなどにテキストを入力するようなものです。私は自分のゲームを Windows 用に書いているだけです。私は Guide.BeginShowKeyboardInput の使用を無視しました。これは自己完結型のゲームの感覚を壊すためです。また、ガイドが常に XBOX ボタンを表示するという事実も、私には正しくないように思えます。はい、それは最も簡単な方法ですが、私はそれが好きではありません。
次にSystem.Windows.Forms.NativeWindowを使ってみました。それを継承するクラスを作成し、それをゲーム ウィンドウ ハンドルに渡し、WndProc 関数を実装して WM_CHAR (または WM_KEYDOWN) をキャッチしましたが、WndProc は他のメッセージに対して呼び出されましたが、WM_CHAR と WM_KEYDOWN は呼び出されませんでした。そのため、そのアイデアを放棄する必要がありました。また、Windows フォーム全体も参照していたため、不要なメモリ フットプリントが肥大化していました。
そこで私の最後のアイデアは、スレッド レベルの低レベル キーボード フックを作成することでした。これはこれまでで最も成功しています。WM_KEYDOWN メッセージが表示されます (WM_CHAR はまだ試していません)。仮想キーコードを Win32 関数 MapVirtualKey で char に変換します。そして、私は私のテキストを手に入れました!(現時点では Debug.Write で印刷しています)
ただし、いくつかの問題があります。Caps Lock がオンになっていて、Shift キーが反応しないかのようです。(もちろんそうではありませんが、キーごとに仮想キー コードが 1 つしかないため、翻訳すると出力が 1 つしかないだけです)、Windows フック リストにアタッチするためオーバーヘッドが追加され、私ほど速くはありません。そうであってほしいのですが、Debug.Write が原因で速度がさらに低下する可能性があります。
画面上のキーボードに頼ることなく、他の誰かがこれに取り組み、解決しましたか? または、私が試してみたいアイデアが他にありますか?
前もって感謝します。
ジミーからの質問
質問の意味がよくわからないかもしれませんが、XNA Keyboard および KeyboardState クラスを使用できないのはなぜですか?
私のコメント:
これは、キーステートを読み取ることはできますが、入力されたテキストにアクセスして、ユーザーがどのように入力したかを知ることができないためです。
それでは、さらに明確にしましょう。ユーザーがテキストボックスに入力しているかのように、ユーザーからのテキスト入力を読み取れるように実装したいと考えています。キーボードと KeyboardState クラスはすべてのキーの状態を取得しますが、各キーと組み合わせをその文字表現にマップする必要があります。これは、特に記号を使用する場合と同じキーボード言語をユーザーが使用しない場合に失敗します (私の二重引用符はシフト + 2 ですが、アメリカのキーボードはリターン キーの近くにあります)。
XNAメッセージポンプがメッセージを変換しないため、WM_CHARを取得できなかったのは、私のウィンドウフックがうまくいったようです。
WM _
KEYDOWN メッセージを受信するたびに TranslateMessage を追加すると、WM_CHAR メッセージを取得したことになり、これを使用して、KeyboardBuffer クラスがサブスクライブしていた MessageHook クラスで文字型イベントを起動し、それをテキスト バッファーにバッファーします:D (または StringBuilder を使用しますが、結果は同じです)
だから私はそれをすべて私が望むように機能させています。
非常に有益なスレッドへのリンクを提供してくれた Jimmy に感謝します。