verde una tienen tareas significan significa responde recuadro que porque palomita mis mark los las iconos icono flechas flecha explorador escritorio check carpeta barra azul archivos aparece icons windows-explorer system-tray systray

icons - tienen - ¿Puedes enviar una señal al Explorador de Windows para que actualice los íconos de la bandeja del sistema?



que significa una flecha azul en una carpeta (6)

Este problema me ha estado afligiendo por bastante tiempo y ha sido realmente molesto.

Cada vez que inicio sesión después de un ciclo de reinicio / encendido, el explorador se toma un tiempo para aparecer. He dado el paso de esperar a que se reinicien todos los servicios y luego inicie sesión, pero no hace ninguna diferencia. El resultado es siempre el mismo: algunos de los íconos no aparecen aunque las aplicaciones hayan comenzado.

He buscado un poco en el código que hace que una aplicación "pegue" un ícono allí, pero ¿hay alguna llamada API que se pueda realizar para que el explorador vuelva a leer toda la información de ese ícono? Como invalidar o redibujar o algo por el estilo?

Aparentemente, parece que Jon tenía razón y no es posible hacerlo.

Seguí el código de Bob Dizzle y Mark Ransom y construí esto (Código Delphi):

procedure Refresh; var hSysTray: THandle; begin hSysTray := GetSystrayHandle; SendMessage(hSysTray, WM_PAINT, 0, 0); end; function GetSystrayHandle: THandle; var hTray, hNotify, hSysPager: THandle; begin hTray := FindWindow(''Shell_TrayWnd'', ''''); if hTray = 0 then begin Result := hTray; exit; end; hNotify := FindWindowEx(hTray, 0, ''TrayNotifyWnd'', ''''); if hNotify = 0 then begin Result := hNotify; exit; end; hSyspager := FindWindowEx(hNotify, 0, ''SysPager'', ''''); if hSyspager = 0 then begin Result := hSyspager; exit; end; Result := FindWindowEx(hSysPager, 0, ''ToolbarWindow32'', ''Notification Area''); end;

Pero fue en vano.

Incluso he intentado con

InvalidateRect() y aún no se presenta.

¿Cualquier otra sugerencia?


Por lo que sé, eso no es posible. Gustavo: depende de cada aplicación poner su notifyicon en la bandeja del sistema y garantizar que se mantenga en el estado correcto.

Notarás a veces cuando explorer.exe falla que ciertos íconos no vuelven a aparecer; esto no es porque su proceso se haya bloqueado, simplemente porque su aplicación no ha puesto el notifyicon en la bandeja del sistema cuando se inició la nueva instancia de explorer.exe arriba. Una vez más, es la aplicación la responsable.

¡Lamento no tener mejores noticias para ti!


Utilizo el siguiente código de C ++ para obtener el identificador de ventana en la ventana de la bandeja. Nota: esto solo ha sido probado en Windows XP.

HWND FindSystemTrayIcons(void) { // the system tray icons are contained in a specific window hierarchy; // use the Spy++ utility to see the chain HWND hwndTray = ::FindWindow("Shell_TrayWnd", ""); if (hwndTray == NULL) return NULL; HWND hwndNotifyWnd = ::FindWindowEx(hwndTray, NULL, "TrayNotifyWnd", ""); if (hwndNotifyWnd == NULL) return NULL; HWND hwndSysPager = ::FindWindowEx(hwndNotifyWnd, NULL, "SysPager", ""); if (hwndSysPager == NULL) return NULL; return ::FindWindowEx(hwndSysPager, NULL, "ToolbarWindow32", "Notification Area"); }


Cubrí este tema el año pasado en mi blog Codeaholic en un artículo titulado [Delphi] Updating SysTray .

Mi solución es una DLL Delphi ActiveX / COM. El enlace de descarga todavía funciona (aunque por cuánto tiempo más no sé, ya que mi membresía PLUG ha expirado).


Eche un vistazo a esta entrada del blog: ACTUALIZANDO EL ÁREA DE NOTIFICACIÓN DEL BARRA DE TAREAS . Estoy usando este código para actualizar la bandeja del sistema para eliminar los iconos huérfanos y funciona perfectamente. La entrada del blog es muy informativa y ofrece una gran explicación de los pasos que realizó el autor para descubrir su solución.

#define FW(x,y) FindWindowEx(x, NULL, y, L"") void RefreshTaskbarNotificationArea() { HWND hNotificationArea; RECT r; GetClientRect( hNotificationArea = FindWindowEx( FW(FW(FW(NULL, L"Shell_TrayWnd"), L"TrayNotifyWnd"), L"SysPager"), NULL, L"ToolbarWindow32", // L"Notification Area"), // Windows XP L"User Promoted Notification Area"), // Windows 7 and up &r); for (LONG x = 0; x < r.right; x += 5) for (LONG y = 0; y < r.bottom; y += 5) SendMessage( hNotificationArea, WM_MOUSEMOVE, 0, (y << 16) + x); }


Dos detalles importantes para cualquier persona que use la respuesta de Louis (de REFRESHING THE TASKBAR NOTIFICATION AREA ) en Windows 7 o Windows 8:

Primero, como se reflejó la respuesta para mostrar, la ventana titulada "Área de notificación" en XP ahora se titula "Área de notificación promovida por el usuario" en Windows 7 (en realidad, probablemente sea Vista) y más.

En segundo lugar, este código no borra los iconos que están ocultos actualmente. Estos están contenidos en una ventana separada. Use el código original para actualizar los íconos visibles y los siguientes para actualizar íconos ocultos.

//Hidden icons GetClientRect( hNotificationArea = FindWindowEx( FW(NULL, L"NotifyIconOverflowWindow"), NULL, L"ToolbarWindow32", L"Overflow Notification Area"), &r); for (LONG x = 0; x < r.right; x += 5) for (LONG y = 0; y < r.bottom; y += 5) SendMessage( hNotificationArea, WM_MOUSEMOVE, 0, (y << 16) + x);

Para cualquiera que solo necesite una utilidad para ejecutar esto, en lugar de código, construí un exe simple con esta actualización: Área de notificación de actualización


Incluya el siguiente código con el suyo para actualizar la bandeja del sistema.

public const int WM_PAINT = 0xF; [DllImport("USER32.DLL")] public static extern int SendMessage(IntPtr hwnd, int msg, int character, IntPtr lpsText); Send WM_PAINT Message to paint System Tray which will refresh it. SendMessage(traynotifywnd, WM_PAINT, 0, IntPtr.Zero);