http://delphi.cjcsoft.net/viewthread.php?tid=631
땅주인 님이 쓰신 글 :
: 개발환경: 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;
: }
:
:
|