|
현재 프로그램이 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;
}
|