C# WinForms 앱 트레이를 최소화하는 적절한 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/46918

  •  09-06-2019
  •  | 
  •  

문제

WinForms 앱을 시스템 트레이로 최소화하는 적절한 방법은 무엇입니까?

메모:최소화하다 시스템 트레이;작업 표시줄 오른쪽 시계 옆에 있습니다.작업 표시줄로 최소화하는 것에 대해 묻는 것이 아닙니다. 이는 창에서 "빼기" 버튼을 눌렀을 때 발생하는 현상입니다.

"최소화하고 ShowInTaskbar = false로 설정한 다음 NotifyIcon을 표시합니다."와 같은 해킹적인 솔루션을 본 적이 있습니다.

이와 같은 솔루션은 앱이 다른 앱처럼 트레이에 최소화되지 않는 것처럼 보이기 때문에 해킹적입니다. 코드는 다른 문제 중에서 ShowInTaskbar = true를 설정할 시기를 감지해야 합니다.

이를 수행하는 올바른 방법은 무엇입니까?

도움이 되었습니까?

해결책

실제로 기본 winforms의 트레이에 해당 형태의 애니메이션을 수행하는 관리되는 방법은 없지만 P/Invoke shell32.dll을 수행할 수 있습니다.

여기에 좋은 정보가 있습니다(게시물이 아닌 댓글에 있음).

http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx

그리고 여기 C++에 있습니다:

http://www.codeproject.com/KB/shell/minimizetotray.aspx

이를 사용하여 C# 버전에 대해 Pinvoke할 내용을 파악할 수 있습니다.

다른 팁

this.WindowState = FormWindowState.Minimized  

이것이 내장된 방식이며 대부분의 경우 나에게는 괜찮아 보입니다.유일한 이상한 점은 시작 시 호출하는 경우이며 때로는 이상한 점이 있기 때문에 대부분의 사람들이 ShowInTaskbar = false를 설정하고 양식도 숨길 것입니다.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx

도움이 될 것입니다:

public partial class Form1 : Form
{
    public static bool Close = false;
    Icon[] images;
    int offset = 0;

    public Form1()
    {
        InitializeComponent();

        notifyIcon1.BalloonTipText = "My application still working...";
        notifyIcon1.BalloonTipTitle = "My Sample Application";
        notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (FormWindowState.Minimized == WindowState)
        {
            this.Hide();
            notifyIcon1.ShowBalloonTip(500);
            //WindowState = FormWindowState.Minimized;
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        this.Show();
        notifyIcon1.ShowBalloonTip(1000);
        WindowState = FormWindowState.Normal;
    }

    private void maximizeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Show();
        WindowState = FormWindowState.Normal;
    }

    private void closeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Close = true;
        this.Close();  
    }

    // Handle Closing of the Form.
    protected override void OnClosing(CancelEventArgs e)
    {
        if (Close)
        {
            e.Cancel = false;
        }
        else
        {
            WindowState = FormWindowState.Minimized;
            e.Cancel = true;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Load the basic set of eight icons.
        images = new Icon[5];
        images[0] = new Icon("C:\\icon1.ico");
        images[1] = new Icon("C:\\icon2.ico");
        images[2] = new Icon("C:\\icon3.ico");
        images[3] = new Icon("C:\\icon4.ico");
        images[4] = new Icon("C:\\icon5.ico");
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        // Change the icon.
        // This event handler fires once every second (1000 ms).
        if (offset < 5)
        {
            notifyIcon1.Icon = images[offset];
            offset++;
        }
        else
        {
            offset = 0;
        }
    }
}

이 코드는 테스트되었으며 다양한 옵션을 지원합니다.

자세한 내용은 여기를 참조하세요: http://code.msdn.microsoft.com/TheNotifyIconExample

업데이트:너무 빨리 포스팅을 한 것 같습니다.나는 또한 내 도구로 아래 해킹을 사용하고있었습니다.이에 대한 올바른 해결책을 기다리고 있습니다...........

이를 위해 Windows.Forms.NotifyIcon을 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

양식에 NotifyIcon을 추가하고 일부 속성을 설정하면 완료됩니다.

        this.ShowIcon = false;//for the main form
        this.ShowInTaskbar = false;//for the main form
        this.notifyIcon1.Visible = true;//for notify icon
        this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));//set an icon for notifyicon

    private void Form1_Shown(object sender, EventArgs e)
    {
        this.Hide();
    }

위와 비슷합니다..

창 크기가 조정될 때마다(최대화, 최소화 등) 트리거되는 크기 조정 이벤트 핸들러가 있습니다.

    public form1()
    {
       Initialize Component();

       this.Resize += new EventHanlder(form1_Resize);
    } 


    private void form1_Resize(object sender, EventArgs e)
    {
       if (this.WindowState == FormWindowState.Minimized && minimizeToTrayToolStripMenuItem.Checked == true)
       {
             NotificationIcon1.Visible = true;
             NotificationIcon1.BalloonTipText = "Tool Tip Text"
             NotificationIcon1.ShowBalloonTip(2);  //show balloon tip for 2 seconds
             NotificationIcon1.Text = "Balloon Text that shows when minimized to tray for 2 seconds";
             this.WindowState = FormWindowState.Minimized;
             this.ShowInTaskbar = false;
       }
    }

이를 통해 사용자는 메뉴 표시줄을 통해 트레이로 최소화할지 여부를 선택할 수 있습니다.Windows ->로 이동하여 트레이로 최소화를 클릭할 수 있습니다.이것이 점검되고 창이 최소화되도록 크기를 조정하면 트레이로 최소화됩니다.나를 위해 완벽하게 작동합니다.

양식 생성자에서:

this.Resize += new EventHandler(MainForm_Minimize);

그런 다음 이 이벤트 핸들러 메소드를 사용하십시오.

    private void MainForm_Minimize(object sender, EventArgs e)
    {
        if(this.WindowState == FormWindowState.Minimized)
            Hide();
    }

이 작업을 수행하는 데 문제가 있는 경우 다음 사항을 확인하세요.

this.Resize += new System.EventHandler(this.Form1_Resize);

fom1.designer.cs에서

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top