ShutdownBlockReasonCreate-创建在注销/关机期间显示的多个原因在我的申请中。我有两种方法来提醒用户:“上传”方法和“下载”方法。如果用户启动长上传,我会设置ShutdownBlockReasonCreate并显示“上传当前正在运行”之类的消息。我遇到的问题是,如果用户在长上传运行时启动简单下载,则还会再次调用ShutdownBlockReasonCreate并显示“下载当前正在运行”消息。这会覆盖原始的“上传当前正在运行”消息。因此,当我的下载方法完成并调用ShutdownBlockReasonDestroy时,用户可以突然关闭并注销,即使上传仍在运行。我希望能够使用我可以调用的可选参数来调用ShutdownBlockReasonCreate,这样我就可以发送多个字符串来说明为什么程序不允许窗口关闭或注销。因此,当用户注销时,如果上传和下载都在运行,我希望它显示:“正在上传”“正在运行下载”。有人可以修改我的代码并告诉我该怎么做吗?如果我能传递“this.Handle”以外的东西;也许我可以那样做,但我不确定怎么做。//http://blogs.msdn.com/b/oldnewthing/archive/2012/06/14/10319617.aspx//http://bartdesmet.net/blogs/bart/archive/2006/10/25/Windows-Vista-_2D00_-ShutdownBlockReasonCreate-in-C_2300_.aspx[DllImport("user32.dll")]publicexternstaticboolShutdownBlockReasonCreate(IntPtrhWnd,[MarshalAs(UnmanagedType.LPWStr)]字符串pwszReason);[DllImport("user32.dll")]publicexternstaticboolShutdownBlockReasonDestroy(IntPtrhWnd);privateboolisBlocked=false;protectedoverridevoidWndProc(refMessageaMessage){constintWM_QUERYENDSESSION=0x0011;constintWM_ENDSESSION=0x0016;如果(isBlocked&&(aMessage.Msg==WM_QUERYENDSESSION||aMessage.Msg==WM_ENDSESSION))返回;base.WndProc(refaMessage);}privatevoidStopShutdown(stringstrMessage){try{//strMessage==在关闭/注销框中显示的消息if(ShutdownBlockReasonCreate(this.Handle,strMessage)){isBlocked=true;Console.WriteLine("++StopShutdown成功");}elseConsole.WriteLine("++StopShutdown失败");}catch(Exceptionext){MessageBox.Show("++StopShutdownError:"+ext.Message+""+ext.StackTrace);}}privatevoidResetShutdown(){try{if(ShutdownBlockReasonDestroy(this.Handle)){isBlocked=false;Console.WriteLine("++ResetShutdown成功");}elseConsole.WriteLine("++ResetShutdown失败");}catch(Exceptionext){MessageBox.Show("++ResetShutdown错误:"+ext.Message+""+ext.StackTrace);}}privatevoidbutton1_Click(objectsender,EventArgse){StopShutdown("正在上传");MessageBox.Show("上传中");重置关机();}privatevoidbutton2_Click(objectsender,EventArgse){StopShutdown("正在下载");MessageBox.Show("下载中");重置关机();确保显示正确的消息,并且如果正在进行阻止操作(并阻止),则始终显示消息,您需要仔细跟踪系统中发生的事情例如,假设您可以有任意数量的上传和下载同时运行。在这种情况下,您的StopShutdown()方法需要确定当前正在进行的操作。如果至少有一个上传但没有下载,则将消息设置为“正在上传”。如果至少有一个下载但没有上传,则将消息设置为“正在下载”。如果每个至少有一个,则将消息设置为“上传和下载”。在ResetShutdown()方法中,您需要再次检查哪些操作仍在进行中。如果不是,那么您应该销毁原因并将isBlocked设置为false。否则,您应该根据当前正在运行的内容调整消息并将isBlocked设置为true。通过这样做,您可以确保两者都有正确的关闭方法,然后仅当程序不在应该阻止关闭的操作中间时才允许关闭。(此外,你应该记住,即使你“阻止”了系统,用户也可以自由地“强制关闭”系统,所以更安全的方法通常是尝试暂停你正在做的事情,然后再恢复.)教程:ShutdownBlockReasonCreate–Createmultiplereasonsdisplayedduringlogout/shutdown所有内容分享,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——本文收集自网络且不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
