posted by 방랑군 2012. 1. 13. 20:01

Blinking in task bar like a MSN messenger

 

이번 강좌의 주제는 “MSN 메신저 스타일의 Task Bar 점멸 기능 넣기입니다.

MSN이나 네이트온 메신저는 새로운 친구가 접속 하거나 새로운 메시지가 도착하면  가지 방법으로 사용자에게 알려주는데  중에 좌측의 시스템 트레이에서 조그만 창이 스르르 올라 오는 기능을 구현 하는 것은 많이 알려져 있습니다만 Task Bar 해당 프로그램의  이름이 점멸하는 기능을 구현 하는 것은 상대적으로  알려져 있지 않은  같아 간단한 강좌를 작성 했습니다.

간단한 기능이므로 필요한 기능만 언급할 것입니다덕분에 강좌의 길이도 작습니다.

 필요한 기능인데 구현 방법을 알지 못해  고생 하는 개발자에게 도움이 되길 바랍니다.

 

[알아두세요]

1.        강좌에서 만들어진 예제는 Windows XP Professional SP2에서 테스트되었습니다.

2.        강좌는 .NET Framework 2.0 Visual Studio 2005 기준으로 제작되었습니다.

3.        강좌에서 사용된 개발 도구와 언어는  Visual Studio 2005 C#입니다.

 

1.       어떤 기능을 구현  것인가?

많은 메신저들이 새로운 메시지가 도착하거나 친구가 접속 했을  사용자에게 알려주기 위해 Task Bar 점멸 기능을 사용합니다 강좌는 메신저를 만들기 위한 강좌는 아니므로 단지 필요한 기능만을 습득하기 위해 샘플 어플리케이션이  활성화되고 일정 시간(5) 경과해도 활성화 되지 않으면 강제로 Task Bar에서 해당 어플리케이션 부분이 점멸하는 기능을 구현  것입니다(그림 1).

 

[그림 1]

 

2.       핵심 API

Task Bar 점멸 기능을 구현하기 위해서는 API 이용하는 방법이 가장 쉽습니다물론  번의 삽질로도 C# 코드만으로 구현이 가능하겠지만 이미 있는 기능 사용하는 것이 수명 연장에도 도움이 되겠죠해당 API 선언부를 알아보겠습니다. MSDN 있는 내용 그대로입니다.

 

FlashWindowEx

Flashes the specified window. It does not change the active state of the window.

BOOL FlashWindowEx)

   PELASHWINFO pfwi

);

Parameters

pfwi

   [in] A pointer to a FLASHWINFO structure.

Return Values

The return value specifies the window’s state before the call to the FlashWindowEx function. If the window caption was drawn as active before the call, the return value is nonzero. Otherwise, the return value is zero.

 

C#에서 사용하기 위한 선언도 알아보죠필요한 상수도 함께 알아보겠습니다.

[StructLayout(LayoutKind.Sequential)]

public struct FLASHWINFO

{

    public UInt16 cbSize;

    public IntPtr hwnd;

    public UInt32 dwFlags;

    public UInt16 uCount;

    public UInt32 dwTimeout;

}

 

private const UInt32 FLASHW_STOP = 0;

private const UInt32 FLASHW_TRAY = 2;

 

[DllImport("user32.dll")]

static extern Int16 FlashWindowEx(ref FLASHWINFO pwfi);

 

3.       간단한 샘플을 만들어보자.

API 모양새를 둘러 보았으니 간단하게 맛보기 샘플을 만들어 보겠습니다. API 어떤 방식으로 동작하는지를 알아보기 위한 것이니 단순하게 API 호출하고 어플리케이션이 어떻게 반응하는지 살펴보겠습니다.

 

Step 1. 윈도우 어플리케이션 프로젝트를 하나 만듭니다.

 

Step 2. 메인  클래스에 위의 API 선언부를 전부 복사  넣습니다.

 

Step 3.  위에 버튼 컨트롤을 하나 배치합니다.

 

Step 4. 버튼의 클릭 이벤트 핸들러에 API 호출하는 코드를 삽입합니다(소스 1).

private void button1_Click(object sender, EventArgs e)

{

    FLASHWINFO fInfo = new FLASHWINFO();

 

    fInfo.cbSize = (ushort)Marshal.SizeOf(fInfo);

    fInfo.hwnd = this.Handle;

    fInfo.dwFlags = FLASHW_TRAY;

    fInfo.uCount = UInt16.MaxValue;

    fInfo.dwTimeout = 0;

 

    FlashWindowEx(ref fInfo);

}

[소스 1]

 

Step 5. 빌드 하고 실행한  버튼을 누르면 Task Bar 해당 어플리케이션 이름 부분이 점멸합니다.

 

4.       어플리케이션 비활성화 알림 기능을 구현  보자.

테스트로 간단한 어플리케이션을 만들어 보았으니 이제 조금  복잡한 기능을 가진 어플리케이션을 만들어 보겠습니다.

제작할 어플리케이션이 가지게  기능은 폼이 비활성화되고 5초가 지나도 활성화 되지 않으면 Task Bar에서 점멸하여 사용자에게 알려주는 기능입니다.

 

Step 1. 윈도우 어플리케이션 프로젝트를 하나 만듭니다.

 

Step 2. 메인  클래스에 위의 API 선언부를 전부 복사  넣습니다.

 

Step 3. Timer 하나 추가하고 Interval 5000으로 설정합니다.

 

Step 4. 폼의 Deactivate 이벤트 핸들러에 타이머를 시작하는 코드를 삽입합니다(소스 2).

private void Form1_Deactivate(object sender, EventArgs e)

{

    this.timer1.Start();

}

[소스 2]

 

Step 5. 타이머의 Tick이벤트 핸들러에 점멸 기능을 활성화 시키는 API 호출 코드를 삽입합니다(소스 3).

private void timer1_Tick(object sender, EventArgs e)

{

    FLASHWINFO fInfo = new FLASHWINFO();

 

    fInfo.cbSize = (ushort)Marshal.SizeOf(fInfo);

    fInfo.hwnd = this.Handle;

    fInfo.dwFlags = FLASHW_TRAY;

    fInfo.uCount = UInt16.MaxValue;

    fInfo.dwTimeout = 0;

 

    FlashWindowEx(ref fInfo);

}

 

Step 6. 폼의 Activate 이벤트 핸들러에 타이머를 정지하고 점멸 기능을 비활성화 시키는 API 호출 코드를 삽입합니다(소스 4).

private void Form1_Activated(object sender, EventArgs e)

{

    this.timer1.Stop();

    FLASHWINFO fInfo = new FLASHWINFO();

 

    fInfo.cbSize = (ushort)Marshal.SizeOf(fInfo);

    fInfo.hwnd = this.Handle;

    fInfo.dwFlags = FLASHW_STOP;

    fInfo.uCount = UInt16.MaxValue;

    fInfo.dwTimeout = 0;

 

    FlashWindowEx(ref fInfo);

}

 

Step 7. 빌드하고 실행합니다테스트  보면 Minimize 버튼을 클릭하거나 다른 어플리케이션을 활성화해서 폼이 비활성화되면 5  Task Bar에서 점멸 기능이 동작 하고 폼을 활성화시키면 점멸 기능이 멈추는 것을   있습니다(그림 2).

 

[그림 2]

 

5.       마무리

FlashWindowEx 동일한 기능을 가진 API로는 FlashWindow 있습니다사용법이 훨씬 간단하므로 단순한 기능을 원한다면 사용에 무리는 없습니다하지만 점멸 간격 등의 정교한 제어를 원한다면 FlashWindowEx API 사용하는 것이 좋습니다파라메터에 해당하는 FLASHWIFO 구조체의 값을 적절히 바꾸어보면서 기능을 살펴보면 정확한 사용법을   있을 것입니다.

 

 

 

 

====================================

서용혁 (hyuki, mvp, c#)

crazy for .NET

Visual Studio 2005, .NET Framework, C#, MSDN Magazine

 

http://www.clrlab.org

====================================