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

C# 获取键盘状态时出现InvalidOperationException(有时),c#,xna,keyboard,invalidoperationexception,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 opera

我正在尝试使用以下代码获取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 ...
我在谷歌上的搜索并没有给我任何关于这段代码的结果

这可能是什么原因造成的?为什么不是每次都会发生,或者从来不会发生,但只是在启动项目时才会发生

编辑:我的线程布局:

  • 主线
  • 开始游戏。运行
  • 在单独的项目中启动网络初始值设定项(在
    Initialize
    中)
  • 这将为网络I/O启动一个新线程
当创建一个只包含
Keyboard.GetState()
的新项目时,我显然得到了一个错误代码
0
,它转换为

错误与成功

0(0x0)

操作已成功完成

看到下面我的屏幕截图,我不知道为什么成功会触发
无效操作异常


Keboard.GetState
在内部使用win32函数
GetKeyboardState
()。如果失败,它将给出一个错误代码,XNA将从中获取并打包到该异常中

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

其中“模块”基本上是指DLL。“未找到”可能指的是正在加载的DLL,或者它需要的DLL(依此类推)。这是一条毫无帮助的错误信息

我不确定要加载什么DLL
GetKeyboardState
,也不确定它为什么会间歇性失败

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

(我想,正确地调试它可能需要使用捕获它无法加载的DLL。)


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

Keboard.GetState
在内部使用win32函数
GetKeyboardState
()。如果失败,它将给出一个错误代码,XNA将从中获取并打包到该异常中

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

其中“模块”基本上是指DLL。“未找到”可能指的是正在加载的DLL,或者它需要的DLL(依此类推)。这是一条毫无帮助的错误信息

我不确定要加载什么DLL
GetKeyboardState
,也不确定它为什么会间歇性失败

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

(我想,正确地调试它可能需要使用捕获它无法加载的DLL。)


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

我不知道这个线程有多老,但我听说它与您的防火墙有关。当我更新我的防病毒软件时,同样的错误也发生在我身上(你是否碰巧使用了Comodo?)。这与XNA无关,我在visual c#express、visual studio 2012和2013中进行了测试,结果都是一样的,然后我尝试了一个新项目,该项目只称为键盘状态,结果再次发生。在我更新杀毒软件之前,这些都没有发生过…

我不知道这个线程有多旧,但我听说它与你的防火墙有关。当我更新我的防病毒软件时,同样的错误也发生在我身上(你是否碰巧使用了Comodo?)。这与XNA无关,我在visual c#express、visual studio 2012和2013中进行了测试,结果都是一样的,然后我尝试了一个新项目,该项目只称为键盘状态,结果再次发生。在我更新防病毒软件之前,所有这些都没有发生…

您是否在主线程中执行这些代码?因为这是必要的。。您应该在更新中执行该代码method@Blau:是的,我在游戏的更新方法中调用这个,我像往常一样在
Main
方法中启动。但是,我正在
游戏中的某个点创建网络线程。初始化
,这可能是错误的原因吗?如果是,如何启动另一个线程而不出现此错误?您是否在主线程中执行该代码?因为这是必要的。。您应该在更新中执行该代码method@Blau:是的,我在游戏的更新方法中调用这个,我像往常一样在
Main
方法中启动。但是,我正在
游戏中的某个点创建网络线程。初始化
,这可能是错误的原因吗?如果是,如何启动另一个线程而不出现此错误?复制到新项目中仍然会出现相同的错误。请参阅我对项目线程布局的编辑。我将如何使用process monitor进行此操作?有1575个条目的
ProcessName==XNAGame.exe&&Result!=成功
,哪些对我的问题很重要?我不是说将代码复制到一个新项目中,我是说在系统上从一个新的空白项目中调用
键盘.GetState
,以查看是您的代码还是您的系统出了故障。就process monitor而言——这确实超出了我在评论中所能解释的范围——尽管我考虑的更多是搜索读取DLL文件失败的原因。考虑一个关于如何调试Win32错误126的新问题(以及为什么<代码> GETKEYBOARSTATE < /代码>可能触发它)。这里的win32专家可能有更好的洞察力。一个新项目给了我错误代码
0
(成功!?),请查看我的编辑和屏幕截图。windows成功后为什么会抛出异常?@csharpler