환경: C++ Builder XE5
4년전에 했던 프로젝트의 문제를 해결하려니 이래저래 까다롭네요.
제가 만든 프로그램은 System Tray에 있다가 사용자가 UI 화면을 Open하면
UI 화면이 열리고, Tray에서는 빠지고,
UI 화면을 닫으면(Form Close event), 다시 Tray에 들어가도록 되어 있습니다.
프로그램의 종료는 Tray에 들어갔을 때 Popup 메뉴에서 종료를 선택하면 프로그램 종료가 되도록 구성했습니다.
종료될 때 Tray에 있는 Icon도 함께 삭제되도록 하였습니다.
문제는 정상적인 종료일 때는 상관없는데,
비정상적인 종료(WatchDog에서 TerminateProcess(hProcess,0) 형태로 Process Kill 시키는데요..)
Process Kill은 되지만 System Tray에 Icon은 정리가 되지 않네요.
예전에, XP에서는 이러한 문제 때문에..
프로그램 시작하면서 마우스 포인터를 강제적으로 System Tray에 가도록 해서 아이콘을 Refresh하는
소스를 봤었는데..
Win7이나 Win10에서는 System Tray가 접혀있는 상태로 사용자가 ▲를 클릭해줘야 Tray UI가 열리니
XP에서 사용하던 트릭도 사용할 수가 없네요.
어떻게 해결해야 할까요?
감사합니다.
//---------------------------------------------------------------------------
bool TFormMain::GoToSystemTray() // Tray에 집어 넣는다.
{
Hide();
WindowState = wsMinimized;
TrayIcon->Visible = true;
return true;
}
//---------------------------------------------------------------------------
bool TFormMain::RestoreFromTray() // Tray에서 꺼낸다.
{
TrayIcon->Visible = false;
Show();
WindowState = wsNormal;
Application->BringToFront();
LocateRightButton();
return true;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormClose(TObject *Sender, TCloseAction &Action)
{
if ( !m_bExit ) {
Action = caNone;
GoToSystemTray(); // 시스템 트레이로 이동
return;
} else { // 정상적인 종료
//------------------------------------------------------------------
// Program Terminate ( Resource Release )
//------------------------------------------------------------------
..
// Resource Release...
..
Action = caFree;
return;
}
}
|