首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Windows c#使“关闭”最小化到托盘而不更改“Alt-F4”或其他关闭方法

如何使用Windows c#使“关闭”最小化到托盘而不更改“Alt-F4”或其他关闭方法
EN

Stack Overflow用户
提问于 2014-09-10 23:11:40
回答 3查看 1.8K关注 0票数 0

当我关闭表单时,我试图使我的应用程序最小化到系统托盘。

我希望它最小化到托盘时,关闭按钮(红色'X')被点击,最好是当窗口是正确的点击和‘关闭’选定的任务栏。

然而,我希望其他形式的关闭保持原样。也就是。‘’Alt F4‘和编码'Form.Close()’

我试着寻找一个解决方案,发现有一个“FormClosingEvent.CloseReason”包含'CloseReason.UserClosing‘。

当我单击“关闭”按钮时,它会被标记,但不幸的是,当我使用'Alt-F4‘和代码使用'Form.Close()’时,也会标记它。

我发现了几种拦截'Alt-F4‘的方法,这些对我都没有用,我希望'Alt-F4’保持原样。

为了澄清,我只想截取:‘关闭’按钮(红色'X')被点击和右键单击关闭在任务栏。

你可以这样想:

代码语言:javascript
复制
1. The user clicks the red 'x'
2. The red 'x' calls a method/event
3. The method/event calls Form.Close()

我想在到达Form.Close()之前拦截,最好是在2发生之前。有办法这样做吗?

我不知道关闭表格和申请的所有方法。在我认识的人中:

  • 任务经理:完好无损。
  • Alt-F4:完好无损。
  • 关闭:完好无损。
  • 红色“X”关闭按钮:被截获。
  • 右键单击任务栏,选择“关闭”:截获。

我希望这能帮上忙。

谢谢你能提供的帮助。

辛西娅

EN

回答 3

Stack Overflow用户

发布于 2014-09-10 23:18:08

我建议使用一个标志(例如bool _allowClose;)。您说您已经可以拦截Alt-F4,我假设在关闭事件发生之前就会发生这种情况。

在Alt-F4截取期间,设置_allowClose = true,然后在关闭事件期间,仅在_allowClose == true时才允许关闭。这可能不是最干净的方法,但它在过去对我起过作用。

例如:

代码语言:javascript
复制
public class MyForm : Form 
{
    bool _allowClose = false;

    void Form_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Alt && e.KeyCode == Keys.F4) _allowClose = true;
    }

    void Form_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (!_allowClose && e.CloseReason == CloseReason.UserClosing)
        {
            e.Cancel = true;
            WindowState = FormWindowState.Minimized;
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2014-09-10 23:43:45

试试这个,但是我的键盘上没有函数键来测试ALT+F4事件。

代码语言:javascript
复制
    protected override void WndProc(ref Message m)
    {
        int WM_SYSCOMMAND = 0x0112;
        int SC_CLOSE = 0xF060;

        if (m.Msg == WM_SYSCOMMAND && m.WParam == new IntPtr(SC_CLOSE))
        {
            WindowState = FormWindowState.Minimized;
            return;
        }

        base.WndProc(ref m);
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Alt | Keys.F4))
        {
            this.Close();
            return true;
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
票数 0
EN

Stack Overflow用户

发布于 2014-09-11 05:24:45

这个简单的方法正在起作用。

将NotifyIcon控件放置到窗体中

将图标文件应用于窗体图标属性

this.Closing事件可能不会出现在预测/智能感知中,所以将其写下来,它将工作。

代码语言:javascript
复制
public Form1()
    {
        InitializeComponent();
        this.Closing += Form1_Closing;
        notifyIcon1.Icon = this.Icon;
        notifyIcon1.Click += notifyIcon1_Click;
    }


void Form1_Closing(object sender, CancelEventArgs e)
    {
        e.Cancel = true;
        notifyIcon1.Visible = true;
        Hide();
    }

 void notifyIcon1_Click(object sender, EventArgs e)
    {
        Show();
        notifyIcon1.Visible = false;
    }

您还可以添加气球提示,就像应用程序在通知托盘中运行一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25776539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档