C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[27197] Re:프로그램을 시스템 트레이에만 나오게 하는 방법을 알고 싶습니다.
Julien [julien] 1474 읽음    2003-09-16 11:25
폼을 생성하고 아이콘을 트레이에 등록했다가 종료할 때 아이콘을 제거해 주시면 됩니다.
트레이에 아이콘이 등록되고 나서 화면에 폼이 나타나지 않기를 원하신다면
프로젝트 소스

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.
: 밑에 답변을 주신분 감사드립니다.
: 도움이 되는 정보였습니다.

+ -

관련 글 리스트
27183 프로그램을 시스템 트레이에만 나오게 하는 방법을 알고 싶습니다. tenut 767 2003/09/16
33396     Re:프로그램을 시스템 트레이에만 나오게 하는 방법을 알고 싶습니다. 하안인 1013 2003/09/16
27197     Re:프로그램을 시스템 트레이에만 나오게 하는 방법을 알고 싶습니다. Julien 1474 2003/09/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.