Skip to content
DarkKaiser의 블로그
DarkKaiser의 블로그
  • 개발 관련 자료(노션)
  • Raspberry Pi(노션)
  • WD My Cloud(노션)
  • GitHub
DarkKaiser의 블로그

트레이아이콘(Tray Icon) 사라지는 버그 막기

DarkKaiser, 2007년 7월 1일2023년 9월 5일

요즘 나오는 프로그램에서는 대부분 ?TrayIcon을 제공합니다. 단순히 프로그램 리스트(태스크 바)에 나오는 것보다는, ?TrayIcon이 사용자에게 보다 더 편리한 UI를 제공하기 때문입니다. 그런데, 익스플로어(인터넷 익스플로어가 아닙니다.)의 버그 때문에 <그림 1>과 같이 종종 TrayIcon이 Tray에서 사라지는 경우가 있습니다. 하지만, 몇몇의 프로그램은 사라지지 않고 계속 남아있는 경우도 볼 수 있습니다.

<그림 1 – 트레이 아이콘에서 사라지는 모습>


그럼 우리의 프로그램도 익스플로어와는 상관없이 계속 트레이에 있으려면 어떻개 해야할까요? 익스플로어는 자신이 죽었다가 새로 시작되는 경우 현재 보이는 모든 윈도우에게 멧세지를 보내주는데, 우리는 이 메시지를 등록하여 사용함으로써 트레이 아이콘이 사라지는 버그를 막을 수 있습니다.

트레이 아이콘에 문제가 생길 경우, 예를 들어 익스플로어가 다운되어 재 시작을 될 때에는 익스플로어가 현재 트레이 아이콘에 등록되어 있는 모든 윈도우에게 보내주는 메시지는 “Taskbar Created”라는 메시지 입니다.

여러분이 그동안 살펴보았단 메세지와 다른 점은 WM_MOUSEMOVE 와 같은 상수값이 아니라, 문자열이라는 점인데, 이런식으로 문자열로 된 메세지는 실제로 있을 수 없습니다. 모든 메세지는 반드시 상수값을 가지고 있어야 합니다. 하지만, 단순한 상수 값으로 메세지를 표현하기에는 한계가 있기 때문에 특정 문자열로 부터 메세지 상수를 등록하는 방법을 사용할 수 있습니다. 물론, “Taskbar Created” 도 고유의 메세지 상수값을 윈도우로부터 얻을 수 있습니다.

이때 메시지를 등록하는 함수는 RegisterWindowMessage() 함수 입니다. 이 함수를 사용하여 반환되는 메시지 ID를 가지고 일반 메시지처럼 메시지 핸들러를 등록하여 사용하면 됩니다. 그리고 결과는 확인해 보고 싶으시면, Ctrl+Alt+Del 을 눌러서 익스플로어(Explorer)를 ‘작업종료’ 시키시면 트레이 아이콘에서 몇몇 아이콘이 사라지는 효과(?)를 보실 수 있습니다. 만일 윈도우즈 NT 계열이라면(Windows 2000 포함) <그림 2>와 같이 작업 관리자를 띄워서 강제로 프로세스를 종료하면 됩니다.


그리고, 익스플로어를 다시 시작하기 위해서는 ‘파일|새 작업(실행…)’ 를 선택하여 explorer 을 입력하시면 됩니다.

하지만, 우리가 만든 프로그램의 트레이 아이콘은 여전히 트레이에서 살아남는 강한 모습을 보여줄 것입니다.

/* 메시지 등록 과정 */ 
UINT g_uShellRestart; 
g_uShellRestart = RegisterWindowsMessage(__Text(“TaskbarCreated”));

/* Message Map 에서 */ 
ON_REGISTERED_MESSAGE(g_uShellRestart, OnTrayShow)

/* 메시지를 처리합니다. */ 
LRESULT CMyDlg::OnTrayShow(WPARAM wParam, LPARAM lParam) 
{ 
    /* TrayIcon을 다시 보여줍니다. ShowTray는 Tray를 보여주는 함수입니다. */ 
    m_Tray.ShowTray();
}
C/C++/VC++ Trayicon트레이아이콘

글 내비게이션

Previous post
Next post

답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

최신 글

  • AssertJ 소개testCompile ‘org.assertj:assertj-core:3.6.2’ 2017년 9월 14일
  • 자주 사용되는 Lombok 어노테이션 2017년 9월 14일
  • 유니코드 #3 2017년 9월 14일
  • 유니코드 #2 2017년 9월 14일
  • 유니코드 #1 2017년 9월 14일

최신 댓글

    카테고리

    • 개인 자료 (1)
      • 일기 (1)
    • 주절주절 (7)
    • 프로그래밍 갤러리 (16)
    • 프로그래밍 언어 (186)
      • Java (29)
      • C/C++/VC++ (114)
      • C# (11)
      • Visual Basic (6)
      • 안드로이드 (9)
      • Objective-C (5)
      • JavaScript (4)
      • JSP/Servlet (2)
      • Python (4)
      • 어셈블러 (1)
    • 개발++ (44)
      • Book (11)
        • Joel On Software (10)
      • 프로젝트 관리 (6)
      • Maven (1)
      • 디버깅 (1)
      • DirectX (1)
      • Silverlight (1)
      • RESTful (1)
      • Hacking (1)
      • WDM (4)
      • VoIP (5)
      • 기타 (1)
    • 개발 도구 (15)
      • eclipse (14)
      • Sublime Text (1)
    • 네트워크 (7)
    • 설치 및 배포 (7)
      • InstallShield (2)
      • NSIS (4)
    • 버전 관리 (9)
      • Git (2)
      • CVS (2)
      • Subversion (5)
    • 데이터베이스 (7)
      • Oracle (3)
      • Sybase (2)
      • MS-SQL (2)
    • 단위테스트 (3)
      • JUnit (1)
      • NUnit (2)
    • 버그추적시스템 (2)
      • mantis (2)
    • 운영체제 (7)
      • Windows (5)
      • 리눅스 (2)
    • WAS (3)
      • WebLogic (3)
    • 디자인패턴 (1)
    • 디지털 이미지 프로세싱 (16)

    태그

    Abstract ActiveX AfxParseURL Automation boost devenv.exe event EventLogTraceListener Hover interface IO iTextSharp JAD jar JavaScript Joel Leave MFC Monitor msdev.com MSDN mutable PDF Properties RAW Saturation SHGetFolderPath SHGetKnownFolderPath SQLite STLTask String TextWriterTraceListener URL VI 권한 데이터소스 디컴파일러 문자열 스레드 동기화 스레드 생성 실용주의 프로그래머 자동화 테스팅 파일포맷 프리컴파일

    메타

    • 로그인
    • 엔트리 피드
    • 댓글 피드
    • WordPress.org
    ©2025 DarkKaiser의 블로그 | WordPress Theme by SuperbThemes