【问题标题】:InvalidOperationException (sometimes) when getting keyboard state获取键盘状态时出现 InvalidOperationException(有时)
【发布时间】:2013-11-16 04:12:49
【问题描述】:

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

【问题讨论】:

  • 您是否在主线程中执行该代码?因为它是必需的.. 你应该在更新方法中执行该代码
  • @Blau:是的,我在我的Main 方法开始的游戏的更新方法中调用它。但是,我在 Game.Initialize 的某个时间点创建了一个网络线程,这可能是错误的原因吗?如果是,我将如何在没有此错误的情况下启动另一个线程?

标签: c# xna keyboard invalidoperationexception


【解决方案1】:

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

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

“模块”基本上是指 DLL。而“未找到”可能指的是正在加载的 DLL,或者 it 需要的 DLL(等等)。这是一个非常无用的错误消息。

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

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

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

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

【讨论】:

  • 复制到新项目中仍然会出现同样的错误。另请参阅我对项目线程布局的编辑。
  • 我将如何使用进程监视器呢? ProcessName == XNAGame.exe && Result != SUCCESS 有 1575 个条目,哪些条目对我的问题很重要?
  • 我的意思不是将你的代码复制到一个新项目中,我的意思是从你系统上的一个新的、否则为空白的项目中调用Keyboard.GetState - 看看是你的代码还是你的系统有错。就进程监视器而言 - 这确实超出了我在评论中可以解释的范围 - 尽管我更多地考虑搜索未能读取 DLL 文件的问题。考虑提出一个关于如何调试 win32 错误 126 的新问题(以及为什么GetKeyboardState 可能会触发它)。这里的win32专家可能有更好的见解。
  • 一个新项目给了我错误代码0(成功!?),请查看我的编辑和屏幕截图。为什么windows成功时会抛出异常?
  • @csharpler 恐怕我完全不知道。我肯定会用win32 标签提出一个新问题——你可能会得到更好的见解(当然,这里的链接是为了获取上下文)。我的猜测是0 意味着GetKeyboardState 失败并且没有设置错误(奇怪),或者在失败和调用GetLastError(更奇怪)之间设置错误为0。在这个阶段,我将研究我的选项是什么,可以一直调试到 GetKeyboardState 方法(如果需要,反汇编)。
【解决方案2】:

我不知道这个线程有多老,但我听说它与您的防火墙有关。当我更新我的防病毒软件时,同样的错误发生在我身上(你碰巧使用 Comodo 吗?)无论如何,检查一下,看看它是否有帮助。和XNA没有关系,我在visual c# express、visual studio 2012、2013中测试过,结果都一样,然后我又试了一个新项目,只叫键盘状态,又出现了。在我更新防病毒软件之前,这一切都没有发生......

【讨论】:

  • 我刚刚检查了我的防火墙关闭,它似乎工作。你是对的,我正在使用 Comodo。已经很晚了,但无论如何感谢您的回答;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 2016-05-10
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多