시스템에 상주하는 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;
}
'API' 카테고리의 다른 글
정보: 성능 카운터 및 인스턴스 열거 PDH 샘플 코드 (1) | 2012.10.25 |
---|---|
커스텀 프로그레스바 만들어 보기 (0) | 2012.10.19 |
프로세스 경로 구할 때 OpenProcess flag 팁 (0) | 2012.10.19 |
비주얼 스튜디오 리소스 편집기에서 에디트 박스 높이가 줄어들지 않을 때 팁 (0) | 2012.03.22 |
WaitForSingleObject의 첫 인수가 스레드 핸들인 경우 유의점 (0) | 2012.03.17 |
뮤텍스와 세마포어,,, WAIT_ABANDONED 발생 여부 (0) | 2012.03.06 |
프로세스, 스레드간의 상호 통신에 주의해야 될 점 (0) | 2011.07.21 |