我有一个订阅了FormClosing事件的事件处理程序。此事件处理程序在用户退出应用程序时为其提供对话框;像这样:
private void frmUavController_FormClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
DialogResult dlgResult = MessageBox.Show("Are you sure you want to exit?", "Exit?",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dlgResult == DialogResult.Yes)
{
UtilSTKScenario.PauseScenarioAnimation(UtilSTKScenario._stkObjectRoot);
}
else if (dlgResult == DialogResult.No)
{
e.Cancel = true;
}
}
因为应用程序以并排方式运行;将COM命令注入另一个应用程序 - 如果接收COM命令的应用程序未启动(或在执行期间关闭),我希望我的应用程序退出。这是这样实现的:
static UtilSTKScenario()
{
// give time for active form to show
Thread.Sleep(100);
_stkProgramId = ConfigurationManager.AppSettings.Get("stkProgramId");
if (CheckIfStkIsLaunched())
{
InitAllFields();
}
else
{
HideController dHideController = new HideController(((frmUavController)Form.ActiveForm).HideControllerUi);
((frmUavController)Form.ActiveForm).Invoke(dHideController);
Application.Exit();
}
}
调用'Application.Exit()'会触发FormClosing事件。这个我不想要 - 相反,我希望应用程序退出。
有什么想法吗?
WulfgarPro
答案 0 :(得分:3)
您可以查看FormClosing事件的事件参数。 FormClosingEventArgs
具有CloseReason
属性,如果表单由用户直接关闭而不是某些其他机制,则可以提供指示。
虽然我不清楚如何显示Application.Exit()
来电...如果它也显示为CloseReason.UserClosing
,那么您可能需要为表单添加重载[例如SystemClose()]关闭表单并使用实例变量告诉它不要在你的处理程序中提示。
答案 1 :(得分:2)
您的FormClosing事件获取FormClosingEventArgs参数,该参数具有CloseReason属性。如果是CloseReason.ApplicationExitCall,则表单因为调用Application.Exit而关闭。你可以跳过你的“关闭?”在这种情况下提示。
private void frmUavController_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.ApplicationExitCall)
return;
// ...
答案 2 :(得分:1)
处理这种事情的典型方法(绕过正常“你要关闭吗?”检查)是使用布尔变量。将其命名为_forceExit
,如果外部事件强制关闭则将其设置为true,如果是,则跳过Closing事件中的对话框。
答案 3 :(得分:0)
你能看一下发件人对象吗?我的猜测是发件人对象的不同取决于您实际关闭表单或调用Application.Exit()
方法。