카테고리 보관물: 프로그래밍

C# 트레이(Tray) 아이콘 표시 프로그램 만들기

개요

프로그램 중 계속 화면을 보여줄 필요는 없지만 여러가지 알림을 사용자에게 주어야 할 경우가 있습니다. 이런 경우 프로그램을 트레이(Tray) 아이콘 형태로 실행되도록 하면 됩니다.

트레이(Tray) 아이콘 구현

트레이(Tray) 아이콘은 작업표시줄 오른쪽에 있는 것을 지칭합니다. 이런식으로 동작하는 프로그램이 적어도 하나이상은 설치되어 있을 것입니다.

이 기능은 NotifyIcon 컨트롤을 사용해서 구현할 수 있습니다.

Visual Studio 에서 WinForm 프로젝트를 새로 생성하면 도구상자에서 다음과 같이 NotifyIcon 컨트롤을 확인할 수 있습니다.

NotifyIcon 컨트롤

NotifyIcon 컨트롤

Form에 NotifyIcon 컨트롤을 추가하고 속성을 보면 다음과 같은 항목을 확인할 수 있습니다.

IconNotify 컨트롤 속성

IconNotify 컨트롤 속성

Icon은 사용하고자 하는 파일을 지정하면 됩니다. ContextMenuStrip 항목은 마우스 우측 버튼을 클릭했을 때 나타나는 메뉴를 관리할 때 사용됩니다. 이미 cmsTrayMenu 라는 이름으로 추가해 둔 상태입니다. 다음과 같이 메뉴 및 도구 모음 하위에 있는 ContextMenuStrip 컨트롤을 추가하면 됩니다.

ContextMenuStrip 컨트롤

ContextMenuStrip 컨트롤

추가된 ContextMenuStrip 컨트롤의 속성을 편집해서 원하는 메뉴를 추가합니다. 예제에서는 간단하게 보기, 종료 메뉴만 추가했습니다.

추가된 메뉴

추가된 메뉴

각 메뉴와 Form 이벤트에 연결된 소스를 보도록 하겠습니다.

private void ToolStripMenuItemShow_Click(object sender, EventArgs e)
{
	loadSendData();
	this.Show();
}

private void ToolStripMenuItemExit_Click(object sender, EventArgs e)
{
	Application.Exit();
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
	this.Show();
}

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

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
	if (e.CloseReason == CloseReason.UserClosing)
	{
		notifyIcon.Visible = true;
		this.Hide();
		e.Cancel = true;
	}
}

4행은 보기 항목을 클릭하면 현재 Form을 Show() 메소드를 호출하도록 합니다.

9행은 종료 항목을 클릭하면 프로그램을 종료하도록 합니다.

14행은 트레이 아이콘을 더블클릭했을 경우 4행과 동일하게 Show() 메소드를 호출하도록 합니다. 없어도 되지만 사용자 편의를 위하여 추가해 보았습니다.

19~22행은 사용자가 Form을 최소화 상태로 했을 때 Form을 숨기는 역할을 합니다.

29~31행은 Form의 종료아이콘을 클릭했을 때 종료가 되지 않고 숨긴 후 종료 이벤트가 중지되도록 하는 역할을 합니다.

알림기능 추가

이번에는 사용자에게 알림을 주는 방법을 알아보도록 하겠습니다. 여러가지 상황이 있겠지만 이번 포스트에서는 지정된 DB를 일정시간 간격으로 검색해서 새로운 자료 도착여부를 알려주는 것으로 하겠습니다.

주기적으로 확인하는 부분에 다음과 같이 구현합니다.

var newData = new NewData();

var notViewDataCount = newData.GetNotViewCount();

if (notViewDataCount > 0)
{
	notifyIcon.ShowBalloonTip(2000, "알림", notViewDataCount + "건의 자료가 전송되었습니다.", ToolTipIcon.Info);
}

알림 메시지를 출력하려면 7행과 같이 ShowBalloonTip 메소드를 사용하면 됩니다. 메소드의 설명은 다음의 주소에서 확인하실 수 있습니다.

NotifyIcon.ShowBalloonTip 메서드

실제로 동작하게 되면 알림메시지 영역에 지정한 메시지가 나타나게 됩니다.

이번 포스트에서는 트레이(Tray) 아이콘 표시 프로그램 만들기 에 대해서 알아보았습니다.

C# 서비스 프로그램 만들기

개요

여러가지 이유로 프로그램을 컴퓨터가 시작되면서 실행해야 하는 경우가 있습니다. 프로그램을  시작 프로그램에 등록해서 실행되도록 할 수 있습니다. 이 방법이 아니고 필요에 따라서 서비스 프로그램으로 제작해야 하는 경우가 있습니다. 이번 포스트에서는 C# 서비스 프로그램 으로 제작하는 방법을 알아보도록 하겠습니다.

서비스 프로그램은 실행파일로 컴파일되도 바로 실행되지 않습니다. 실행하면 다음과 같은 오류가 발생합니다.

서비스 프로그램을 바로 실행한 경우

서비스 프로그램을 바로 실행한 경우

installutil 유틸리티를 이용하여 등록해야 합니다. 이 유틸리티는 다음의 경로에 있습니다. 프롬프트는 관리자 모드로 실행 후 명령을 수행해야 제대로 설치됩니다. 그렇지 않으면 “System.Security.SecurityException: 소스를 찾을 수 없습니다. 일부 또는 전체 이벤트 로그를 검색하지 못했습니다. 액세스할 수 없는 로그: Security.” 이런식의 오류가 발생합니다.

C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil

다음의 명령으로 등록하면 되고 /u 옵션을 주면 등록을 해제할 수 있습니다.

C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe C:\경로\서비스프로그램.exe

서비스 프로그램 프로젝트 생성

프로젝트 생성을 선택하고 다음의 Windows 서비스 템플릿을 선택합니다.

Windows 서비스 템플릿 선택

Windows 서비스 템플릿 선택

서비스 프로그램에서 처리할 부분을 작업하고 빌드합니다. 생성된 exe파일을 위의 명령으로 등록해보면 정상적으로 되지 않는 것을 알수 있습니다. “D:\temp\WindowsService1\WindowsService1\bin\Release\WindowsService1.exe 어셈블리에서 RunInstallerAttribute.Yes 특성을 포함하는 공용 설치 관리자를 찾을 수 없습니다.
설치 관리자가 없으므로 InstallState 파일을 제거합니다.” 별도의 설치관련 클래스를 추가해야 합니다.

설치되지 않을때의 메시지

설치되지 않을때의 메시지

설치관련 클래스추가

아래와 같이 클래스를 추가합니다. 여기에서 클래스는 public으로 선언해야 정상적으로 서비스로 설치됩니다.

설치 관리자 클래스 추가

설치 관리자 클래스 추가

클래스를 추가한 후 System.Configuration.Install 어셈블리를 참조 추가합니다.

System.Configuration.Install 어셈블리를 참조 추가

System.Configuration.Install 어셈블리를 참조 추가

다음과 같이 생성자를 추가하고 서비스의 이름과 설명등을 적절하게 입력합니다. RunInstallerAttribute(true) 속성을 추가하고 WindowsServiceInstaller 클래스는 Installer 클래스를 상속하도록 합니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace WindowsService1
{
	[RunInstallerAttribute(true)]
	public class WindowsServiceInstaller: Installer
	{
		public WindowsServiceInstaller()
		{
			var serviceProcessInstaller = new ServiceProcessInstaller();
			var serviceInstaller = new ServiceInstaller();

			serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
			serviceProcessInstaller.Username = null;
			serviceProcessInstaller.Password = null;

			serviceInstaller.Description = "Mail monitoring service";
			serviceInstaller.DisplayName = "Mail monitor";
			serviceInstaller.ServiceName = "Mail monitoring";
			serviceInstaller.StartType = ServiceStartMode.Automatic;

			this.Installers.Add(serviceProcessInstaller);
			this.Installers.Add(serviceInstaller);
		}
	}
}

빌드한 후 위의 등록 명령을 다시 실행하면 정상적으로 등록됨을 알 수 있습니다.

정상적으로 등록된 서비스 프로그램

정상적으로 등록된 서비스 프로그램

이상으로 .NET 기반 C# 으로 서비스 프로그램을 만드는 방법을 알아보았습니다.