|
폼을 생성하고 아이콘을 트레이에 등록했다가 종료할 때 아이콘을 제거해 주시면 됩니다.
트레이에 아이콘이 등록되고 나서 화면에 폼이 나타나지 않기를 원하신다면
프로젝트 소스
Application->Initialize(); 다음 줄에
ShowWindow(Application->Handle, SW_HIDE);
Application->ShowMainForm = false;
이 내용을 추가하시기 바랍니다.
폼을 트레이에 등록하는 함수입니다.
OnCreate 에서 실행하면 됩니다.
void __fastcall TForm1::AddTray()
{
NOTIFYICONDATA icondata;
memset (&icondata, 0, sizeof (icondata));
icondata.cbSize = sizeof(icondata);
icondata.hWnd = Handle;
icondata.uID = 100;
strncpy (icondata.szTip, "프로그램 실행 중", sizeof (icondata.szTip));
icondata.hIcon = Application->Icon->Handle;
icondata.uCallbackMessage = iconmessage;
icondata.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
Shell_NotifyIcon (NIM_ADD, &icondata);
}
트레이에서 아이콘을 제거하는 함수입니다.
OnClose 에서 실행하시면 됩니다.
void __fastcall TForm1::RemoveTray()
{
NOTIFYICONDATA icondata;
memset (&icondata, 0, sizeof (icondata));
icondata.cbSize = sizeof (icondata);
icondata.hWnd = Handle;
icondata.uID = 100;
icondata.uFlags = 0;
Shell_NotifyIcon (NIM_DELETE, &icondata);
}
프로그램이 비정상 종료했을 경우 마우스로 트레이를 한 번 지나가면
쓸데없는 아이콘이 없어지는 것을 보신 적이 있을 겁니다.
트레이위로 마우스가 실제로 지나가는 것과 같은 메시지를 발생시켜
트레이에 남아 있는 아이콘을 제거할 때 사용하는 함수입니다.
AddTray 하기 전에 한 번 실행해 주시면 기존에 있던 필요없는 아이콘이 사라지게 됩니다.
void __fastcall TForm1::ClearTray()
{
HWND hdHandle;
RECT rtRect;
int itWidth, itHeight, itX, itY;
tagPOINT tpPosition;
hdHandle = FindWindowEx(FindWindow("Shell_TrayWnd", NULL), 0, "TrayNotifyWnd", NULL);
GetWindowRect(hdHandle, &rtRect);
itWidth = GetSystemMetrics(SM_CXSMICON);
itHeight = GetSystemMetrics(SM_CYSMICON);
GetCursorPos(&tpPosition);
for(itY = 0; itY <= (rtRect.bottom - rtRect.top) / itHeight; itY++)
for(itX = 0; itX <= (rtRect.right - rtRect.left) / itWidth; itX ++)
{
SetCursorPos(rtRect.left + itX * itWidth, rtRect.top + itY * itHeight);
::Sleep(0);
}
SetCursorPos(tpPosition.x, tpPosition.y);
RedrawWindow(hdHandle, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW);
}
tenut 님이 쓰신 글 :
: 프로그램을 작업표시줄에는 나오지 않게하고
: 시스템 트레이에만 나오게 하는 방법을 알고 싶습니다.
:
: p.s.
: 밑에 답변을 주신분 감사드립니다.
: 도움이 되는 정보였습니다.
|