Letimičnim Google-ovanjem nisam pronašao neki automatizovan metod za refresh sistemskog tray-a. Izgleda da ne postoji. Ono što preostaje je simuliranje WM_MOUSEMOVE iznad regije tray-a, što će ukloniti mrtve ikone.
Ovde sam pronašao neki kod:
http://www.themssforum.com/MFC/Refresh-system/
@BaseQ
Koje razvojno okruženje koristiš? Da li beše BCB?
Ako da, evo koda koji sam delimično modifikovao (da radi kad je tray u vise linija) i prilagodio (neke casting konvencije) da se kompajlira i radi sa Borland C++ Builder okruženjem.
Ono što uočavam kao anomaliju ovog programa (originalni primer) je da on prolazi samo po jednoj horizontalnoj liniji po širini tray-a, očekujući da niko od korisnika nema tray u dva ili više redova, kao na primer ja. He he ;) Drugim rečima, ovaj kod neće raditi ako je tray ikona u drugom redu. Dalje, korak mu je jedan piksel, sto je verovatno isuvise sitno, ali nema veze. Brzo ce to raditi.
Evo koda:
Code:
// ...
BOOL CALLBACK ProcessTrayChildren (HWND hwnd, LPARAM lParam);
BOOL CALLBACK ProcessIcons (HWND hwnd, LPARAM lParam);
// ...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND hTray = ::FindWindow( "Shell_TrayWnd", NULL );
if (hTray)
{
EnumChildWindows( hTray, (WNDENUMPROC)ProcessTrayChildren, 0 );
}
}
BOOL CALLBACK ProcessTrayChildren( HWND hwnd, LPARAM lParam )
{
char ClassName[256];
GetClassName( hwnd, ClassName, sizeof( ClassName ) );
if ( strcmp( ClassName, "TrayNotifyWnd" ) == 0 )
{
EnumChildWindows( hwnd, (WNDENUMPROC)ProcessIcons, 0 );
return FALSE;
}
return TRUE;
}
BOOL CALLBACK ProcessIcons( HWND hwnd, LPARAM lParam )
{
RECT rect_tb;
int y,x;
char ClassName[256];
GetClassName( hwnd, ClassName, sizeof(ClassName) );
if ( strcmp( ClassName, "ToolbarWindow32" ) == 0 )
{
::GetClientRect( hwnd, &rect_tb );
for ( y=rect_tb.left; y<=rect_tb.right; y++ )
{
for ( x=rect_tb.top; x<=rect_tb.bottom; x++ )
{
::SendMessage( hwnd, WM_MOUSEMOVE, 0, MAKELONG(x,y) );
}
}
return FALSE;
}
return TRUE;
}
// ...
[Ovu poruku je menjao X Files dana 16.11.2008. u 10:13 GMT+1]