|
TrayBar의 버그로 어플리케이션이 비정상적으로 종료가 되면 나타나는 문제입니다. 그렇기 때문에 어플리케이션에서 어떤식으로 만들어도 그 버그는 나타나게 됩니다. 이 문제는 Builder 뿐만이 아니라 모든 어플리케이션에서 공통적으로 일어나는 문제입니다.
강제적으로 Refresh 시켜주는 방법 또한 먹지 않습니다. (부분적인 OS에서만 되는것 같더군요) 그래서 그냥 고전적인 방법으로 마우스를 아이콘 각각에 위치시키는 방법을 몇몇 어플리케이션에서는 사용하고 있습니다.
아래 소스는 해당하는 그 소스로, 제가 만든건 아니고 델파이로 뉴스그룹에 돌아다니던걸 빌더로 포팅해 본것 입니다. 테스트도 해봤는데, 잘 동작되네요.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
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);
}
//---------------------------------------------------------------------------
박용우 님이 쓰신 글 :
:
: 답변이 없어서.. 한번 더 올립니다
: 혹시 방법이 없는건가요???
:
:
:
: 시스템 트레이 부분에 트레이 아이콘을 지우고 났는데도..
: 비정상 종료 되면. .아이콘이 남아 있군요
:
: 이것을 없애려면... 마우스로 그 트레이 아이콘 위에 가야 없어지더라구요...
:
:
: 아마도.. 마우스가 그 트레이 아이콘 위에 가면 repaint 하는거 같은데.. .
: 시스템 트레이 부분을 repaint 하는 방법은... 없을까요...
:
: 고수님들 가르쳐 주세요...
:
: ^^; 부탁합니다 꾸우뻑
:
|