본문 바로가기
Study/MFC

TrayIcon이 사라지는 버그 현상

by 뿡뿡대마왕 2011. 9. 28.
반응형

ㅡ,.ㅡ ..분명 트레이 아이콘을 등록했는데..사라졋당..헐.;;;
재부팅하면서 자동으로 트레이 아이콘을 등록하게끔  해놓았는데..이놈이 도대체 어딜갔단 말인다..ㅠㅠ
무한정 삽질을 할뻔했지만 회사 과장님으로 부터 정보를 받아 다행히 쉽게 해결할 수 있었다..ㅋㅋ

자..내용을 구구절절 쓰기는 귀찮으니.. 컨트롤 C + V 신공을 발휘하도록 하겠다~!
이야압!!!!~~
출처: http://blog.naver.com/ratmsma?Redirect=Log&logNo=40028805165


트레이 아이콘에 문제가 생길 경우, 예를 들어 익스플로어가 다운되어

재 시작을 될 때에는 익스플로어가 현재 트레이 아이콘에 등록되어

있는 모든 윈도우에게 보내주는 메시지는 “Taskbar Created"라는

메시지 입니다. 

여러분이 그동안 살펴보았단 메세지와 다른 점은 WM_MOUSEMOVE 와

같은 상수값이 아니라, 문자열이라는 점인데, 이런식으로 문자열로 된

메세지는 실제로 있을 수 없습니다. 모든 메세지는 반드시 상수값을

가지고 있어야 합니다. 하지만, 단순한 상수 값으로 메세지를 표현하기에는

 한계가 있기 때문에 특정 문자열로 부터 메세지 상수를 등록하는

방법을 사용할 수 있습니다. 물론, “Taskbar Created" 도 고유의 메세지

상수값을 윈도우로부터 얻을 수 있습니다.

이때 메시지를 등록하는 함수는 RegisterWindowMessage() 함수 입니다.

이 함수를 사용하여 반환되는 메시지 ID를 가지고 일반 메시지처럼 메시지

핸들러를 등록하여 사용하면 됩니다. 그리고 결과는 확인해 보고 싶으시면,

Ctrl+Alt+Del 을 눌러서 익스플로어(Explorer)를 ‘작업종료’ 시키시면 트레이

아이콘에서 몇몇 아이콘이 사라지는 효과(?)를 보실 수 있습니다. 
만일 윈도우즈 NT 계열이라면(Windows 2000 포함) <그림 2>와 같이

작업 관리자를 띄워서 강제로 프로세스를 종료하면 됩니다.

. 예제 코드 

 // 메시지 등록 과정  
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(); 
//긍까, 메시지를 다시 보여주는 코드를 삽입하라는 말이죠..ㅎ
}
ShowTray()에는 아래와 같은 코드가 들어가야 되겠죠.. 
    NOTIFYICONDATA nid;    
                    
    nid.cbSize = 
sizeof
(nid); 
    nid.hWnd = m_hWnd;        
    nid.uID = IDR_MAINFRAME;  
    nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
    nid.uCallbackMessage = WM_ICON_NOTIFY;
    
//이 부분이 중요 - 트레이 아이콘에서 이벤트 발생시 발생되는 메세지 정의하는 부분.. 
    nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
    strcpy(nid.szTip,"Test");
    Shell_NotifyIcon(NIM_ADD,&nid); 
    SendMessage(WM_SETICON,(WPARAM)TRUE,(LPARAM)nid.hIcon);

    //일단 아이콘 생성하기 전에 다이얼로그를 숨겨야 겠죠..^^
    ShowWindow(SW_HIDE);

 


반응형

댓글