2011-07-17 14 views
5

Quiero que mi aplicación tenga un ícono en el área de notificación en Windows 7. Utilicé Shell_NotifyIcon para agregar el ícono. Aparece el ícono, pero cuando coloco el puntero del mouse sobre el ícono, el ícono desaparece. La aplicación se ejecuta todo el tiempo. El ícono no está oculto, simplemente desaparece.El icono agregado a la bandeja de notificaciones desaparece en el mouse sobre

Shell_NotifyIcon devuelve un valor distinto de cero, lo que significa que tiene éxito.

Aquí está el código correspondiente:

static const int ID_TRAYICON = 300; 
static const int MSG_TRAYICON = WM_USER + 1; 
NOTIFYICONDATA nid; 
void InitTrayIconData() 
{ 
    memset(&nid, 0, sizeof(NOTIFYICONDATA)); 

    nid.cbSize = sizeof(NOTIFYICONDATA); 
    nid.hWnd = hwnd; 
    nid.uID = ID_TRAYICON; 
    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; 
    nid.uCallbackMessage = MSG_TRAYICON; 
    nid.hIcon = LoadIcon(nullptr, IDI_APPLICATION); 
    //nid.uVersion = NOTIFYICON_VERSION_4; 
    lstrcpy(nid.szTip, TEXT("Data Aggregator in-dev version")); 
} 

Entonces al procesar el mensaje WM_CREATE:

InitTrayIconData(); 
Shell_NotifyIcon(NIM_ADD, &nid); 

Y al procesar WM_DESTROY:

Shell_NotifyIcon(NIM_DELETE, &nid); 

También he notado que para algunos razón por la cual nunca se llama al mensaje MSG_TRAYICON.

Respuesta

6

Me di cuenta. Cuando llamé a InitTrayIconData() en WM_CREATE, aún no se había asignado al hwnd global el valor devuelto desde CreateWindowEx (el mensaje WM_CREATE no se envió después de la llamada CreateWindowEx, pero durante el mismo, que no sabía). Así, la línea,

nid.hWnd = hwnd; 

simplemente equipara a nid.hWnd NullPtr (que es lo que había inicializado a hwnd).

Resolví el problema pasando el argumento hwnd en WndProc a InitTrayIconData(), por lo que usaría ese hwnd en lugar del hwnd global.

+1

Tuve exactamente el mismo problema, gracias por apuntarme en la dirección correcta. – quantum

5

Esto ocurre cuando el sistema no puede comunicarse con la aplicación que posee el icono de notificación.

Normalmente esto se debe a que el proceso ha finalizado anormalmente. En su caso, usted indica que el proceso se está ejecutando todo el tiempo. Por lo tanto, solo puedo concluir que el identificador de ventana asociado con el ícono de notificación se ha destruido o que no responde correctamente a los mensajes. Ese diagnóstico también coincide con su observación de que no recibe MSG_TRAYICON.

Cuestiones relacionadas