C# 获取键盘状态时出现InvalidOperationException(有时)
我正在尝试使用以下代码获取XNA应用程序中的键盘状态: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
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(依此类推)。这是一条毫无帮助的错误信息
我不确定要加载什么DLLGetKeyboardState
,也不确定它为什么会间歇性失败
尝试修复此问题的第一步可能是创建一个新的空白项目,并查看是否得到相同的结果,以便确定是您的代码还是系统或XNA安装有问题
(我想,正确地调试它可能需要使用捕获它无法加载的DLL。)
此外,Blau是正确的-XNA中的所有输入都必须在主线程上完成。
Keboard.GetState
在内部使用win32函数GetKeyboardState
()。如果失败,它将给出一个错误代码,XNA将从中获取并打包到该异常中
该错误代码转换为:“找不到指定的模块。”
其中“模块”基本上是指DLL。“未找到”可能指的是正在加载的DLL,或者它需要的DLL(依此类推)。这是一条毫无帮助的错误信息
我不确定要加载什么DLLGetKeyboardState
,也不确定它为什么会间歇性失败
尝试修复此问题的第一步可能是创建一个新的空白项目,并查看是否得到相同的结果,以便确定是您的代码还是系统或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