获取键盘状态时出现InvalidOperationException(有时)

时间:2013-06-09 13:28:22

标签: c# xna keyboard invalidoperationexception

我正在尝试使用以下代码在我的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

error code zero

2 个答案:

答案 0 :(得分:2)

Keboard.GetState在内部使用win32函数GetKeyboardStateMSDN)。如果失败,它会提供this list的错误代码,XNA会为您提取并打包到该异常中。

该错误代码转换为:“无法找到指定的模块。”

其中“模块”基本上是指DLL。并且“未找到”可能指的是正在加载的DLL,或者 it 的DLL依次需要(等等)。这是一个非常无益的错误信息。

我不确定DLL GetKeyboardState可能尝试加载什么,或者它为什么会间歇性地失败。

尝试修复此问题的第一步可能是创建一个新的空白项目并查看是否得到相同的结果,这样您就可以确定它是您的代码,还是您的系统或XNA安装有问题。

(我想实际上正确调试这可能涉及使用Process Monitor来捕获它无法加载的DLL。)

此外,Blau是正确的 - XNA中的所有输入必须在主线程上完成。

答案 1 :(得分:1)

我不知道这个帖子多大了,但我听说它与你的防火墙有关。当我更新我的防病毒软件时,我发生了同样的错误(你碰巧使用了Comodo吗?)无论如何,检查一下,看看是否有帮助。它与XNA无关,我在visual c#express,visual studio 2012和2013中测试过,结果相同,然后我尝试了一个只调用键盘状态的新项目,它再次发生了。在我更新防病毒软件之前,没有一件事发生过......