API

비정상적인 explorer 다운 상황 후 발생하는 메시지 및 트레이 아이콘 되살리기

디버그정 2012. 10. 16. 17:23

시스템에 상주하는 explorer.exe가 비정상적인 에러로 다운되버릴 경우,

explorer.exe는 자체적으로 재실행되지만,,, 트레이에 상주중인 아이콘은 전부 날라가버린다.

해당 사건이 발생한 경우 대비 트레이 아이콘을 복구하는 코드를 넣어줘야 된다.

 

explorer.exe가 재시작되는 경우 각각의 윈도우들에 특별한 메시지가 전달되는데,

일반적인 WM_COMMAND, WM_CLOSE처럼 절대적인 상수값이 정해진 메시지들과 다르게

RegisterWindowMessage API를  통해 구할 수 있다.

특별한 문자열을 인수로 줘서 OS에 등록하고, 사용하는 쪽에서도 이 API를 사용하여 등록된 메시지 정수값을 구하는 방식이다.

고유한 문자열을 인수로 주기 때문에 프로세스간 상호 통신에 쓰이기도 한다.

이 경우에 굳이 적용하자면 시스템 프로세스와 여타의 다른 프로세스간의 통신으로 볼 수 있을 것이다.

 

explorer.exe가 실행될시 보내는 메시지는 아래와 같이 구해진다.

UINT uTaskbarCreated = RegisterWindowMessage(_T("TaskbarCreated"));

참고로 uTaskbarCreated는 상수가 아닌 변수이기 때문에  case문으로는 사용 못한다.

switch 끄트머리 default 부분에서 if문으로 처리하면 된다.(아래 참조)

참고로 MFC는 메시지맵 매크로들을 사용하여 새로운 메시지를 등록하고 처리하므로

해당 양식에 맞춰주면 된다. 구글링 참조.

 

static UINT uTaskbarCreated;

switch (msg)
{

case WM_INITDIALOG: // 혹은 case WM_CREATE:

  uTaskbarCreated = RegisterWindowMessage(_T("TaskbarCreated"));  // 메시지 정수값을 알아낸다.
  

~~~~~

case WM_COMMAND:

~~~~~

 

default: // 스위치문의 끄트머리

if (msg == uTaskbarCreated) {

// 트레이 아이콘 복구 코드

~~~~~~~~~~

Shell_NotifyIcon(NIM_ADD, &nid);

}

break;

}