개발환경: RAD Studio XE5(C++ Builder)
프로그램의 운영 상황에 따라 프로그램을 System Tray에 넣거나 빼거나 하는 상황입니다.
WatchDog에서 특정 상황이 되어 대상 프로그램을 Kill 시킬 때, 이 프로그램이 System Tray에
있으면 Process는 Kill 되지만 System Tray의 Icon은 그대로 남아있네요.
프로그램이 정상 종료 절차를 밟으면 Tray Icon도 정상적으로 삭제되지만,
WatchDog에서 강제로 Process Kill하면 Tray에 그냥 남아있는데요..
몇 번을 반복하면 System Tray에 동일 아이콘이 여러 개 남아 있어 보기도 좋지 않아서,
이를 해결했으면 하는데, 딱히 방법이 떠오르지 않네요.
감사합니다.
//---------------------------------------------------------------------------
// 프로그램을 System Tray에 넎는다.
bool TFormMain::GoToSystemTray()
{
Hide();
WindowState = wsMinimized;
TrayIcon->Visible = true;
return true;
}
//---------------------------------------------------------------------------
// 프로그램을 System Tray에서 빼낸다.
bool TFormMain::RestoreFromTray()
{
TrayIcon->Visible = false;
Show();
WindowState = wsNormal;
Application->BringToFront();
return true;
}
WatchDog의 Process Kill시키는 소스..
//---------------------------------------------------------------------------
bool TFormMain::ProcessKill(UnicodeString sProcess)
{
DWORD dwSize = 250;
HANDLE hSnapShot;
PROCESSENTRY32 pEntry;
BOOL bCurrent = FALSE;
hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,NULL);
pEntry.dwSize =sizeof(pEntry);
Process32First (hSnapShot,&pEntry);
bool bOk = false;
while(TRUE)
{
BOOL hRes = Process32Next(hSnapShot,&pEntry);
if(hRes == FALSE) break;
if(!wcsncmp(pEntry.szExeFile, sProcess.c_str(), sProcess.Length()))
{
bCurrent = TRUE;
}
if(bCurrent)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pEntry.th32ProcessID);
if(hProcess)
{
if(TerminateProcess(hProcess, 0))
{
unsigned long nCode;
GetExitCodeProcess(hProcess, &nCode);
bOk = true;
}
CloseHandle(hProcess);
}
}
bCurrent = FALSE;
}
return bOk;
}
|