시스템 트레이에 앱 최소화


114

C # 및 Visual Studio 2010으로 구동되는 Windows Forms 앱이 있습니다.

내 앱을 작업 표시 줄이 아닌 시스템 트레이로 최소화 한 다음 시스템 트레이를 두 번 클릭하면 다시 가져올 수 있습니까? 어떤 생각? 또한 시스템 트레이의 아이콘에 메뉴를 만들 수 있으며 마우스 오른쪽 버튼을 클릭하면 로그인, 연결 해제, 연결과 같은 메뉴가 표시됩니다. 또한 시스템 트레이에서 풍선이 튀어 나오는 것처럼 표시하는 방법이 있습니까?

추신 : 이미 notifyIcon을 추가했지만 사용 방법을 모르겠습니다.


여기에서 훌륭한 샘플 코드를 다운로드 할 수 있습니다. simple-talk.com/dotnet/.net-framework/…
개발자

폼의 Designer.cs로 이동하여 이벤트 핸들러를 "등록"하거나 이들 중 아무것도 작동하지 않을 것입니다 (알 수 없습니다). 다음과 같이 추가하여이를 수행 할 수 있습니다. this.Resize + = new System.EventHandler (this.ManagementForm_Resize);
Brad

답변:


149

폼의 Resize 이벤트를 처리합니다. 이 처리기에서 Resize 이벤트의 기본 기능을 재정 의하여 양식을 작업 표시 줄이 아닌 시스템 트레이로 최소화합니다. 이는 폼의 Resize 이벤트 처리기에서 다음을 수행하여 수행 할 수 있습니다. 폼의 WindowState 속성이 FormWindowState.Minimized로 설정되어 있는지 확인합니다. 그렇다면 양식을 숨기고 NotifyIcon 개체를 활성화 한 다음 몇 가지 정보를 보여주는 풍선 팁을 표시하십시오. WindowState가 FormWindowState.Normal이되면 Visible 속성을 false로 설정하여 NotifyIcon 개체를 비활성화합니다. 이제 작업 표시 줄에서 NotifyIcon 개체를 두 번 클릭하면 창이 다시 나타나기를 원합니다. 이를 위해 NotifyIcon의 MouseDoubleClick 이벤트를 처리합니다. 여기에서는 Show () 메서드를 사용하여 양식을 표시합니다.

private void frmMain_Resize(object sender, EventArgs e)
{
    if (FormWindowState.Minimized == this.WindowState)
    {
       mynotifyicon.Visible = true;
       mynotifyicon.ShowBalloonTip(500);
       this.Hide();
    }

    else if (FormWindowState.Normal == this.WindowState)
    {
       mynotifyicon.Visible = false;
    }
}

5
당신은 Form.FormBorderStyle 속성 변경할 수 있습니다 msdn.microsoft.com/en-us/library/...
CD ..

tnx! 그것은 작동했습니다 .. 또한 오른쪽 상단의 최소화, 닫기, 최대화 버튼을 비활성화하는 아이디어가 있습니까? tnx
WantIt 2011 년


tnx도 작동했습니다! 또한 시스템 트레이에있는 아이콘을 더블 클릭하면 창이 다른 응용 프로그램보다 맨 위에 있지 않으므로 작업 표시 줄에있는 창을 클릭하여 표시해야합니다. 어떻게 처리 할 수 ​​있습니까? TNX 훨씬
WantIt


69

나는 전체 솔루션을 달성하기 위해 이것을 발견했습니다. 위의 대답은 작업 표시 줄에서 창을 제거하지 못합니다.

private void ImportStatusForm_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(3000);
        this.ShowInTaskbar = false;
    }
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    notifyIcon.Visible = false;
}

또한 양식 디자이너를 사용하여 알림 아이콘 컨트롤의 다음 속성을 설정하는 것이 좋습니다.

this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't think there is an error.
this.notifyIcon.BalloonTipText = "[Balloon Text when Minimized]";
this.notifyIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); //The tray icon to use
this.notifyIcon.Text = "[Message shown when hovering over tray icon]";

7
당신은 this.Show();전에 놓쳤습니다this.WindowState = FormWindowState.Normal;
developerwjk

1
"사용자가하지 않습니다"의 오타. ;)
Andrew

1
@developerwjk, 그가 전화하지 않았기 때문에 누락되지 않았습니다 Hide(). 그러나이 방법의 문제점은 Alt-Tab을 눌렀을 때 창이 여전히 나타난다는 것입니다. 나는 전화를 선호 Hide()하고 그렇게하면 ShowInTaskbar재산을 전혀 사용할 필요가 없습니다 .
Andrew

앤드류 사용할 때이 문제가 발생 Show()하고 Hide(); 숨기고, 보여주고, 숨기고 나면 다시 나타나지 않습니다.
newbieguy

@newbieguy, 귀하의 문제가 답변에 대한 의견에 적합하지 않기 때문에 새로운 질문을 만들어야한다고 생각합니다. 사용중인 코드로 더 많은 정보를 제공해야합니다. 사용하려고 한 답변에 대한 링크를 포함 할 수 있습니다.
Andrew

17

나는 함께 갈 것이다

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

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

17

notifyIcon에 아이콘 파일을 추가하는 것을 잊지 마십시오. 그렇지 않으면 트레이에 나타나지 않습니다.


주제에서 가장 필요한 부분입니다. 더 많은 정보를 추가 할 수 있습니까? 기본 아이콘을 사용하도록 강제하는 방법은 무엇입니까?
T.Todua

12

이 시도

 private void Form1_Load(object sender, EventArgs e)
    {
        notifyIcon1.BalloonTipText = "Application Minimized.";
        notifyIcon1.BalloonTipTitle = "test";
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            ShowInTaskbar = false;
            notifyIcon1.Visible = true;
            notifyIcon1.ShowBalloonTip(1000);
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ShowInTaskbar = true;
        notifyIcon1.Visible = false;
        WindowState = FormWindowState.Normal;
    }

1
을 호출하는 대신 작업 표시 줄에서 숨긴 경우 this.Hide()Alt-Tab을 수행 할 때 창이 계속 나타납니다.
Andrew

3

이것은 제가 응용 프로그램에서 사용하는 방법입니다. 상당히 간단하고 자명하지만 귀하의 의견에 대한 답변으로 더 자세한 정보를 제공하게되어 기쁩니다.

    public Form1()
    {
        InitializeComponent();

        // When window state changed, trigger state update.
        this.Resize += SetMinimizeState;

        // When tray icon clicked, trigger window state change.       
        systemTrayIcon.Click += ToggleMinimizeState;
    }      

    // Toggle state between Normal and Minimized.
    private void ToggleMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;
        this.WindowState = (isMinimized) ? FormWindowState.Normal : FormWindowState.Minimized;
    }

    // Show/Hide window and tray icon to match window state.
    private void SetMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;

        this.ShowInTaskbar = !isMinimized;           
        systemTrayIcon.Visible = isMinimized;
        if (isMinimized) systemTrayIcon.ShowBalloonTip(500, "Application", "Application minimized to tray.", ToolTipIcon.Info);
    }

2
이 솔루션과 다른 솔루션에는 한 가지 문제가 있습니다. 양식이 다른 창 아래에 숨겨져있는 경우 사용자가 아이콘을 클릭 할 때 최소화하고 싶지 않을 가능성이 높습니다. 대신 집중해야합니다. 여기에 내 질문을 참조하십시오 stackoverflow.com/questions/36797442/...
MAF 소프트

1

시스템 트레이의 이미지를 클릭하면 프레임이 보이는지 확인할 수 있으며 Visible = true 또는 false로 설정해야합니다.


1

... 그리고 오른쪽 클릭 알림 메뉴의 경우 컨텍스트 메뉴를 폼에 추가하고 편집하고 각 컨텍스트 메뉴 항목을 두 번 클릭하여 마우스 클릭 이벤트를 설정 한 다음 notifyicon 속성에서 ContextMenuStrip을 선택하여 notifyicon1에 연결합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.