gpt4 book ai didi

c# - 区分用户关闭表单和用户关闭应用

转载 作者:行者123 更新时间:2023-11-30 22:01:19 26 4
gpt4 key购买 nike

我正在处理以下场景:

  • 当用户试图关闭我的应用程序中的一个特定表单时(通过 Ctrl + F4 或通过专用按钮)我需要他在满足某些条件时注销,
  • 因此我覆盖了 OnFormClosed 方法,检查条件,如果满足条件,我会显示一个消息框,一旦用户单击“确定”,他就会退出我的应用程序,
  • 我正在调查 FormClosedEventArgs.CloseReason 并且只在 UserClosing 的情况下应用此逻辑,
  • 但是,当用户试图关闭整个应用程序时(通过 Alt + F4 或右上角的关闭按钮),CloseReason仍然是 UserClosing,因此他没有关闭应用程序,而是显示了消息框并随后注销了应用程序。这是不希望的,因为应用程序关闭显然比注销更强大。

那么我的问题 - 是否有一种很好的方法来区分用户关闭表单或用户关闭整个应用程序?我可能可以通过覆盖 ProcessCmdKey 来设置一些 bool 标志,以区分 Alt + F4Ctrl + F4,但这不是很好,也没有解决单击关闭按钮时的问题。

最佳答案

没有好的方法,您必须在 FormClosing 事件开始触发之前检测到用户关闭您的主窗口。这不是 Winforms 中公开的功能,但您可以通过重写主窗口的 F​​orm 类中的 WndProc() 方法轻松添加它。您对 WM_SYSCOMMAND 消息、SC_CLOSE 命令感兴趣:

    public static bool MainWindowClosing;

protected override void WndProc(ref Message m) {
if (m.Msg == 0x112 && (m.WParam.ToInt32() & 0xfff0) == 0xf060) {
MainWindowClosing = true;
}
base.WndProc(ref m);
}

现在您可以在其他类中测试该变量:

    protected override void OnFormClosing(FormClosingEventArgs e) {
if (!Form1.MainWindowClosing && e.CloseReason == CloseReason.UserClosing) {
// Display your dialog
//...
}
base.OnFormClosing(e);
}

如果您采取任何措施阻止用户关闭您的应用,则需要将 MainWindowClosing 设置回 false。我不想提的是,在高度安全的 Windows 登录之外添加登录过程是一个严重的错误,很可能会泄露密码。

关于c# - 区分用户关闭表单和用户关闭应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27817556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com