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 ...

我在谷歌和 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 安装有问题。

(我想实际上正确调试可能涉及使用进程监视器来捕获它无法加载的 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 回答