시스템 트레이에서만 실행되는 .NET Windows Forms 응용 프로그램을 만들려면 어떻게해야합니까?


216

시스템 트레이에서 Windows Forms 응용 프로그램을 실행 하려면 어떻게해야 합니까?

트레이를 최소화 할 수있는 응용 프로그램은 아니지만 아이콘, 도구 설명 및 "오른쪽 클릭"메뉴 외에 트레이에만있는 응용 프로그램.



9
세트에 잊지 마세요 - 대부분의 답변에없는 것이 있습니다 icon.Visible = false다음, Dispose()응용 프로그램을 종료 할 때 아이콘. 그렇지 않으면 프로그램이 종료 된 후에도 아이콘이 계속 표시됩니다. 두 번 테스트 한 후에는 더 이상 어떤 아이콘이 실제인지 알 수 없습니다.
Tomasz Gandor

보다 현대적인 WPF 방식을 따르는 경우
Murray Foxcroft

답변:


86

코드 프로젝트 기사 Tasktray 응용 프로그램 만들기 는 시스템 트레이에만 존재하는 응용 프로그램을 만드는 간단한 설명과 예를 제공합니다.

기본적으로 Application.Run(new Form1());라인을 변경하여 에서 Program.cs상속되는 클래스를 시작하고 해당 클래스 ApplicationContext의 생성자가NotifyIcon

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new MyCustomApplicationContext());
    }
}


public class MyCustomApplicationContext : ApplicationContext
{
    private NotifyIcon trayIcon;

    public MyCustomApplicationContext ()
    {
        // Initialize Tray Icon
        trayIcon = new NotifyIcon()
        {
            Icon = Resources.AppIcon,
            ContextMenu = new ContextMenu(new MenuItem[] {
                new MenuItem("Exit", Exit)
            }),
            Visible = true
        };
    }

    void Exit(object sender, EventArgs e)
    {
        // Hide tray icon, otherwise it will remain shown until user mouses over it
        trayIcon.Visible = false;

        Application.Exit();
    }
}

13
이것은 좋은 출발점입니다. "AppIcon"은 "프로젝트-> 특성-> 자원-> 자원 추가"로 추가 한 자원의 이름이어야하며 프로젝트를 다시 컴파일해야합니다.
Lavamantis

1
속성 ..resources..add resource..icon ..을 다시 컴파일했는데 여전히 "오류 CS0103 이름 '리소스'가 현재 컨텍스트에 존재하지 않습니다."
barlop

@barlop 나는 이렇게 써야했다 : Properites.Resources.AppIcon
Simon Perepelitsa

@SimonPerepelitsa 고마워, 나는 내 실험에서 내가 한 일을 잘 모르겠다. 나는 무엇이 효과가 있었는지 언급하려고 노력했지만, 내가 한 일 중 일부를 잊었을 것이다. 그러나 궁극적으로 내가 사용한 방법은 드래그 할 수있는 것들의 팔레트에서 알림 아이콘을 드래그하는 것입니다. 그런 다음 양식에서 클릭하면 작은 화살표를 클릭하여 아이콘을 선택할 수있는 메뉴가 나타납니다!
barlop

17

mat1t가 말했듯이-응용 프로그램에 NotifyIcon을 추가 한 다음 다음 코드와 같은 것을 사용하여 툴팁과 상황에 맞는 메뉴를 설정해야합니다.

this.notifyIcon.Text = "This is the tooltip";
this.notifyIcon.ContextMenu = new ContextMenu();
this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method)));

이 코드는 시스템 트레이의 아이콘 만 보여줍니다.

this.notifyIcon.Visible = true;  // Shows the notify icon in the system tray

어떤 이유에서든 양식이있는 경우 다음이 필요합니다.

this.ShowInTaskbar = false;  // Removes the application from the taskbar
Hide();

컨텍스트 메뉴를 가져 오려면 마우스 오른쪽 버튼을 클릭하면 자동으로 처리되지만, 왼쪽 클릭에 대해 조치를 수행하려면 클릭 핸들러를 추가해야합니다.

    private void notifyIcon_Click(object sender, EventArgs e)
    {
        var eventArgs = e as MouseEventArgs;
        switch (eventArgs.Button)
        {
            // Left click to reactivate
            case MouseButtons.Left:
                // Do your stuff
                break;
        }
    }

15

.NET 1.1로 트레이 바 앱을 작성했으며 양식이 필요하지 않았습니다.
우선, 프로젝트의 시작 객체를 Main모듈에 정의 된 Sub로 설정하십시오 .
그런 다음 프로그램 구성 요소를 만들기 : NotifyIconContextMenu. "종료"또는 이와 유사한
것을 포함해야합니다 MenuItem.
바인딩 ContextMenu받는 NotifyIcon.
를 호출하십시오 Application.Run().
끝내기에 대한 이벤트 핸들러에서 MenuItem확인 전화를하는 설정 NotifyIcon.Visible = FalseApplication.Exit(). 필요한 것을 추가하고 ContextMenu올바르게 처리하십시오 :)


11
  1. 마법사를 사용하여 새 Windows 응용 프로그램을 만듭니다.
  2. 지우다 Form1코드에서 하십시오.
  3. Program.cs에서 코드를 제거하여 Form1 .
  4. 사용 NotifyIcon 하여 시스템 트레이 아이콘 (여기에 아이콘을 할당)을 만들 클래스를.
  5. 컨텍스트 메뉴를 추가하십시오.
  6. 또는 반응 NotifyIcon 의 마우스 클릭에 오른쪽 클릭과 왼쪽 클릭을 구별하여 상황에 맞는 메뉴를 설정하고 어느 버튼 (오른쪽 / 왼쪽)을 눌렀는지 표시합니다.
  7. Application.Run()앱을 계속 Application.Exit()종료하여 종료합니다. 또는 bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. 그런 다음 bRunning = false;앱을 종료하도록 설정 하십시오.

Main 끝에 도달하고 UI 스레드가 없으면 프로그램 실행이 중지됩니다. 이 문제를 어떻게 해결합니까? 당신이 그 문제를 해결했다면 다음과 같은 표를 얻습니다 :)
Matthew Steeples

당신은 내 투표를 얻습니다. 어쩌면 매개 변수없이 Application.Run을 호출해야한다고 언급 할 수 있습니까?

App.Run의 대안으로 업데이트되었습니다.
Wolf5 2016 년

thread.sleep은 내가 아는 과잉이지만 Application.Run에 대한 더 나은 "sleep"루프 대안이 있다면 게시하십시오 :)
Wolf5

Thread.Sleep은 나쁜 생각입니다. 방금 Application.Run을 수행 한 것보다 많은 CPU와 배터리를 사용하게됩니다.
Sneftel

8

"시스템 트레이"응용 프로그램은 일반적인 Win Form 응용 프로그램이지만 Windows 시스템 트레이 영역에 아이콘을 생성한다는 점만 다릅니다. NotifyIcon component를 사용하여 sys.tray 아이콘을 만들려면 도구 상자 (공통 컨트롤)에서 해당 아이콘을 찾아 속성 (아이콘, 도구 설명)을 수정할 수 있습니다. 또한 마우스 클릭 및 더블 클릭 메시지를 처리 ​​할 수 ​​있습니다.

모양과 느낌 또는 표준 트레이 응용 프로그램을 달성하기 위해 한 가지 더 있습니다. 기본 양식 쇼 이벤트에 followinf 행을 추가하십시오.

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

6

내가 아는 한 양식을 사용하여 응용 프로그램을 작성해야하지만 양식에 대한 컨트롤이 없으며 표시되지 않도록 설정해야합니다. NotifyIcon (의 MSDN 샘플을 찾을 수 있습니다 여기를 응용 프로그램을 작성하는).


1
좀 빠지는. 양식에는 컨트롤이 포함될 수 있지만 기본적으로 숨겨져 있어야합니다.
Rune Grimstad

5
어떤 형태도 필요하지 않습니다. 새로운 Window App 생성 마법사 후에 Form1을 삭제하고 여는 코드를 제거하십시오. NotifyIcon과 ContextMenu가있는 Program.cs에서 모두 쓸 수 있습니다. 더 이상 필요하지 않습니다.
Wolf5

1
컨트롤을 포함 할 수 있지만 OP는 원하지 않습니다.
Matthew Steeples

2

다음은 Visual Studio 2010 , .NET 4에서 수행 한 방법입니다.

  1. Windows Forms 응용 프로그램을 만들고 속성에서 '단일 인스턴스 응용 프로그램 만들기'를 설정하십시오.
  2. ContextMenuStrip 추가
  3. 컨텍스트 메뉴 스트립에 항목을 추가하고 두 번 클릭하여 핸들러를 가져옵니다 (예 : 'exit'(두 번 클릭)-> 핸들러-> me.Close ()
  4. 디자이너에서 contextMenuStrip을 방금 만든 아이콘으로 설정하고 아이콘을 선택하십시오 ( 'common7 ...'의 VisualStudio 폴더에서 일부를 찾을 수 있습니다).
  5. 디자이너에서 폼의 속성을 설정하십시오. FormBorderStyle : none, ShowIcon : false, ShowInTaskbar : false, Opacity : 0 %, WindowState : Minimized
  6. Form1_Load의 끝에 Me.Visible = false를 추가하면 Ctrl+를 사용할 때 아이콘이 숨겨집니다.Tab
  7. 필요에 따라 실행하고 조정하십시오.

2

알림 영역 응용 프로그램을위한 매우 친숙한 프레임 워크입니다 ... NotificationIcon을 기본 양식에 추가하고 자동 생성 코드를 아래 코드로 변경하면 충분합니다.

public partial class Form1 : Form
{
    private bool hidden = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.ShowInTaskbar = false;
        //this.WindowState = FormWindowState.Minimized;
        this.Hide();
        hidden = true;
    }

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        if (hidden) // this.WindowState == FormWindowState.Minimized)
        {
            // this.WindowState = FormWindowState.Normal;
            this.Show();
            hidden = false;
        }
        else
        {
            // this.WindowState = FormWindowState.Minimized;
            this.Hide();
            hidden = true;
        }
    }
}

-2

간단히 추가

this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;

양식 객체에. 시스템 트레이에는 아이콘 만 표시됩니다.


작업 표시 줄 위에 양식 이 표시됩니다. 같은 것이 아닙니다. 다른 게시물에 응답하려고합니까?
LarsTech

1
작업 표시 줄에 아이콘이 없으며 양식이 표시되지 않습니다. 시각적으로 프로그램은 시스템 트레이에만 존재합니다. 위의 의미 는 무엇입니까 ?
YTerle

귀하의 답변에 컨텍스트가 없습니다. NotifyIcon 클래스를 사용하고 있습니까? 그렇지 않은 경우 양식이 작업 표시 줄 위 왼쪽 아래 모서리로 최소화됩니다.
LarsTech

1
바쁘지 않으면 작성하여 실행하십시오.
YTerle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.