0

次のコードを使用して、XNA アプリケーションでキーボードの状態を取得しようとしています。

this.OldKeyboard = this.NewKeyboard;
this.NewKeyboard = Keyboard.GetState();
this.OldMouse = this.NewMouse;
this.NewMouse = Mouse.GetState();

ただし、ゲームを開始すると、次のメッセージが表示されることがあります (約 60% と思います) 。InvalidOperationException

An invalid operation occurred when trying to query the keyboard state.
The result code was 126.

at Microsoft.Xna.Framework.Input.Keyboard.GetState(PlayerIndex playerIndex)
at Microsoft.Xna.Framework.Input.Keyboard.GetState()
at GameLib.GameBase.Update(GameTime gameTime) in MY_PATH\GameLib\GameLib\GameBase.cs:Line 58.
at Microsoft.Xna.Framework.Game.RunGame(Boolean useBlockingRun)
at ...

Google と SO で検索しても、このコードに関する結果は得られませんでした。

これの原因は何でしょうか?また、プロジェクトの開始時に時々発生するだけで、毎回発生しない、またはまったく発生しないのはなぜですか?

編集:私のスレッドのレイアウト:

  • メインスレッド
  • 始まるGame.Run
  • 別のプロジェクトでネットワーク初期化子を開始します ( 内Initialize)
  • ネットワーク I/O 用の新しいスレッドを開始します

のみを含む新しいプロジェクトを作成するKeyboard.GetState()と、 のエラー コードが表示0されるようです。

ERROR_SUCCESS

0 (0x0)

操作は正常に完了しました。

以下のスクリーンショットを参照してください。なぜ成功するとInvalidOperationException.

エラーコードゼロ

4

2 に答える 2

2

Keboard.GetState内部で win32 関数GetKeyboardState( MSDN ) を使用します。それが失敗した場合は、このリストからエラー コードが返され、XNA がそれをフェッチしてその例外にパックします。

このエラー コードは、「指定されたモジュールが見つかりませんでした」に変換されます。

「モジュール」は基本的にDLLを意味します。また、「見つからない」とは、ロードされている DLL や、必要な DLL (など) を指す場合があります。これは非常に役に立たないエラー メッセージです。

どの DLLGetKeyboardStateがロードしようとしているか、または断続的に失敗する理由がよくわかりません。

おそらく、これを修正しようとする最初のステップは、新しい空のプロジェクトを作成し、同じ結果が得られるかどうかを確認することです。これにより、それがコードなのか、システムまたは XNA のインストールに問題があるのか​​ を判断できます。

(実際にこれを適切にデバッグするには、Process Monitorを使用して、読み込みに失敗している DLL をキャッチする必要があると思います。)

また、Blau は正しいです。XNA でのすべての入力は、メイン スレッドで行う必要があります。

于 2013-06-10T04:40:17.407 に答える
1

このスレッドがどのくらい古いものかはわかりませんが、ファイアウォールに関係があると聞きました。ウイルス対策を更新したときに同じエラーが発生しました(たまたまComodoを使用していますか?)とにかく、それをチェックして、それが役立つかどうかを確認してください. XNA とは関係ありません。Visual C# Express、Visual Studio 2012、および 2013 でテストしたところ、同じ結果が得られました。次に、キーボードの状態のみを呼び出す新しいプロジェクトで試しましたが、再び発生しました。そして、ウイルス対策を更新する前に、それは起こりませんでした...

于 2013-11-15T20:12:49.087 に答える