FormClosingEventArgs.CloseReason中的错误?我要问的要求是大约12个人正在使用这个应用程序,但如果使用任何其他方法(TaskManager、WindowsShutdown),我们只想允许4人通过传统方法(Alt+F4、文件>退出、关闭)关闭应用程序或者其中之一允许用户关闭应用程序,我们需要进行一些清理(关闭一些连接通道)我已经使用代码满足上述要求privatevoidformClosing(objectsender,FormClosingEventArgse){//如果允许用户关闭应用程序,一个空文件(文件名)//将位于应用程序的根目录中。if(e.CloseReason==CloseReason.UserClosing&&!File.Exists("filename")){e.Cancel=true;返回;}//Cleanup}Issue如果用户(不允许关闭)尝试通过传统方法关闭应用程序,尝试使用任务管理器关闭它,CloseReason枚举似乎不会自行重置,导致任务管理器弹出窗口强制关闭,防止清理应用程序。问题这是一个错误,还是我遗漏了在取消FormClosing事件后重置CloseReason的内容。在探索WinForms的工作原理时,.NETReflector是您的好帮手。Form类有一个名为closeReason的内部字段,用于生成您在Closing事件中检查的事件参数。这个内部字段设置在我能找到的四个不同的地方。这些是...1.Form.Close()方法设置closeReason=UserClosing。这是有道理的,因为手动调用Form.Close()方法通常是某些用户操作的结果,例如用户选择文件->退出菜单选项。显然,这是一个用户操作。2、WM_SYSCOMMAND(SC_CLOSE)设置closeReason=UserClosing。Form的WndProc通过将closeReason设置为UserClosing来处理SC_CLOSE系统命令,并让默认窗口proc执行并关闭应用程序。这是有道理的,因为当用户按下窗口关闭chrome按钮或通过右键单击标题栏选择关闭选项时,将发送此SC_CLOSE。两者都是用户操作,因此将closeReason设置为UserClosing似乎是正确的。3、WndProc处理消息WM_CLOSE(0x10)withcloseReadon=TaskManagerClosing任务管理器和其他应用程序发送WM_CLOSE关闭窗口,如果closeReason当前等于None,更新为TaskManagerClosing。请注意问题并仅在没有问题时更新它,因为我认为这对您来说是个问题。4、WndProc用closeReason=WindowsShutDown处理消息0x11和0x16这不是很有趣,因为你不关心这种情况,但这只是关闭消息的标准处理。所以你遇到的核心问题是当你取消Closing事件时closeReason不会重置为None。因此,如果发生在取消之后,上面的第3点将永远不会正确地将值更新为TaskManagerClosing。由于closeReason是内部字段,因此无法直接更新。但是你可以作弊,这是我过去使用过的一种方法。您需要使用反射来访问内部字段,然后在事件处理程序中设置Cancel=true时将其重置为None。我还没有测试过这段代码,但你需要什么...pi.SetValue(this,CloseReason.None,null);我不认为如果任务管理器(即操作系统......他是“大老板”)启动你的进程就不可能关闭你可以否认它与关闭你的程序一样毫无意义。下一个最好的事情是记录你的应用程序的状态,然后用一些启动选项实例化你的进程的另一个实例,从你离开的地方继续。操作系统终止了您的进程,但您立即启动了另一个进程。此外,如果用户单击应用程序列表中的TaskManager“GotoProcess”,并从那里终止进程,我认为你根本不会收到任何事件......也许最好有一个窗口服务在幕后运行,并跟踪一个实例正在运行。这样,用户可能不会意识到这样一个进程的存在,因为它不是他们的应用程序,您可以使用它来跟踪应用程序关闭。以上就是C#学习教程:ErrorinFormClosingEventArgs.CloseReason?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
