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
[71884] 트레이 아이콘 지우는 방법을 알고 싶어요.
임용태 [lyt0324] 4099 읽음    2014-10-19 20:05
현재 프로그램이 2개가 있습니다.

한개의 프로그램에서 다른 한개의 프로그램으로 변수값을 넘겨주는 형식인데 변수값을 넘겨주는 프로그램에서

트레이를 생성합니다. 그런데 생성된 트레이는 작업표시줄에 나타나지않고 숨겨진 아이콘에 나타납니다.(알림만)

이 트레이를 밑의 소스로 트레이 생성위치에서 얻어와 지우려고 하였으나 프로그램에서 만든 트레이는 받아오질 못하여 지워지지가 않고 숨겨진 아이콘 표시에서 아이콘이 중복되어 나타납니다. (마우스를 갖다대면 없어짐)
(알림만 형태가 아닌 아이콘 및 알림 표시상태에서는 트레이를 정상적으로 지움)

어떻게 해야되는지 모르겠습니다 ㅠㅠ

HWND hwndToolbarWindow32 = NULL;
    HWND hwndShellTrayWnd;

    hwndShellTrayWnd = ::FindWindow(_T("Shell_TrayWnd"), NULL);
    if(hwndShellTrayWnd) {
        HWND hwndTrayNotifyWnd = ::FindWindowEx(hwndShellTrayWnd,NULL,_T("TrayNotifyWnd"), NULL);
        if(hwndTrayNotifyWnd) {
            HWND hwndSysPager = ::FindWindowEx(hwndTrayNotifyWnd,NULL,_T("SysPager"), NULL);        // WinXP
            // WinXP 에서는 SysPager 까지 추적
            if(hwndSysPager)
                hwndToolbarWindow32 = ::FindWindowEx(hwndSysPager, NULL,_T("ToolbarWindow32"), NULL);
            // Win2000 일 경우에는 SysPager 가 없이 TrayNotifyWnd -> ToolbarWindow32 로 넘어간다
            else
                hwndToolbarWindow32 = ::FindWindowEx(hwndTrayNotifyWnd, NULL,_T("ToolbarWindow32"), NULL);
        }
    }

    try
    {
        HANDLE                         hProcess;
        LPVOID                         lpData;
        TBBUTTON                        tb;
        TRAYDATA                       tray;
        DWORD                          dwTrayPid;
        int                            nTrayCount;
//
        // Tray 의 윈도우 핸들 얻기
        HWND hTrayWnd = hwndToolbarWindow32;
        if (hTrayWnd == NULL)
            return;

        // Tray 의 개수를 구하고
        nTrayCount = (int)::SendMessage(hTrayWnd, TB_BUTTONCOUNT, 0, 0);

        // Tray 윈도우 핸들의 PID 를 구한다
        GetWindowThreadProcessId(hTrayWnd, &dwTrayPid);

        // 해당 Tray 의 Process 를 열어서 메모리를 할당한다
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwTrayPid);
        if (!hProcess)
            return;

        // 해당 프로세스 내에 메모리를 할당
        lpData = VirtualAllocEx(hProcess, NULL, sizeof (TBBUTTON), MEM_COMMIT, PAGE_READWRITE);
        if (!lpData)
            return;

        // Tray 만큼 뺑뺑이
        for(int i = 0; i < nTrayCount; i++)
        {
            ::SendMessage(hTrayWnd, TB_GETBUTTON, i, (LPARAM)lpData);

            // TBBUTTON 의 구조체와 TRAYDATA 의 내용을 얻기
            ReadProcessMemory(hProcess, lpData, (LPVOID)&tb, sizeof (TBBUTTON), NULL);
            ReadProcessMemory(hProcess, (LPCVOID)tb.dwData, (LPVOID)&tray, sizeof (tray), NULL);

            // 각각 트레이의 프로세스 번호를 얻어서
            DWORD dwProcessId = 0;
            GetWindowThreadProcessId(tray.hwnd, &dwProcessId);

            // Process 가 없는 경우 TrayIcon 을 삭제한다
            if (dwProcessId == 0)
            {
                NOTIFYICONDATA        icon;
                icon.cbSize           = sizeof(NOTIFYICONDATA);
                icon.hIcon            = tray.hIcon;
                icon.hWnd             = tray.hwnd;
                icon.uCallbackMessage = tray.uCallbackMessage;
                icon.uID              = tray.uID;

                Shell_NotifyIcon(NIM_DELETE, &icon);
            }
        }

        // 가상 메모리 해제와 프로세스 핸들 닫기
        VirtualFreeEx(hProcess, lpData, NULL, MEM_RELEASE);
        CloseHandle(hProcess);
    }
    catch (...)
    {
        return;
    }

+ -

관련 글 리스트
71884 트레이 아이콘 지우는 방법을 알고 싶어요. 임용태 4099 2014/10/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.