Buscador
YoReparo.com La Web 

Regístrate gratis para participar de los foros, o si ya estás registrado haz login.

Menú Contextual de ícono de notificación no desaparece

comentario del autor Mar Ago 05, 2008 2:44 am
   
Normalmente me apoyo en las innunmerables clases que Borland distribuye con sus compiladores. Pero como me metí en un proyecto basado en OGRE estoy aprendiendo c++ así que trato de hacerlo todo en c++.

Este es un programa que pone un ícono de notificación en el área de notificación. Intercepta el mensaje WM_COMMAND y muestra un menú contextual. El problema es que el menú contextual sólo se va si doy clic en algún comando, pero si decido que no quiero hacer nada y doy clic en el escritorio no se va. Seguro me falta interceptar algún mensaje, llevo algún tiempo leyendo la documentación del SDK de Windows pero no encuentro la respuesta.

Nota: no estoy usando la clase NotifyIcon ni el switch clr, ni planeo usarlo. Es un programa muy sencillo y no vale la pena así que interactúa directo con el API de Windows. El código, en su estado actual, todavía no contiene ninguna clase así que se puede pasar a C si se le cambian algunas líneas.

Código:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
   case WM_USER:
      if (wParam == IconUID)
      {
         BOOL enabled;
         if (lParam == WM_LBUTTONUP)
         {
            SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &enabled, 0);
            if (enabled == 0) enabled++; else enabled = 0;
            if (SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, enabled, NULL, 0))
            {
               if (enabled == 0) MessageBox(NULL, "Protector de pantalla desactivado", "Cambio de estado", MB_OK);
               else MessageBox(NULL, "Protector de pantalla activado", "Cambio de estado", MB_OK);
            }
         } else if (lParam == WM_RBUTTONUP)
         {
            POINT p;
            GetCursorPos(&p);
            TrackPopupMenuEx(menu, 0, p.x, p.y, hWnd, NULL);
         }
      }
      break;
   case WM_COMMAND:
      if (HIWORD(wParam) == 0) //0 significa que el mensaje viene de un menú
      {
         switch (LOWORD(wParam))
         {
         case MI_EXIT:
            PostQuitMessage(0);
            break;
         }
      }
      break;
   case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }

    return 0;
}


Gracias por leer hasta aquí.

JHControlIcons.rar  (3,29 kb) - Código fuente completo sin binarios

JHAx86

Reputación

comentario del autor Jue Ago 21, 2008 3:07 pm
   
Ok, la solución era una tontería: Lo que ocurre es que para que un menú contextual de un ícono de notificación desaparezca éste tiene que pertenecer a la ventana que está primera en el orden z. Es decir, antes de mostrar el menú contextual debemos hacer que la ventana que recibe los mensajes del menú sea la primera del orden z, esto se consigue llamando a SetForegroundWindow() con el handle de nuestra ventana como parámetro, antes de llamar a TrackPopupMenu() o TrackPopupMenuEx().

Me tomó algún tiempo darme cuenta porque la documentación del SDK de Windows que siempre consulto es la que viene con mi Borland Delphi 5, porque la considero más fácil de buscar. Pero si buscamos en la documentación en línea la página sobre TrackPopupMenuEx fue actualizada y se le agregaron unos comentarios al final, allí explica que para íconos de notificación el menú no desaparece si la ventana que pasamos como parámetro no es la primera del orden z. Esos comentarios no están en la ayuda del SDK de windows que te instala el Delphi 5 y que es la ayuda que más consulto (aunque venga con el Delphi los ejemplos del SDk están en C así que me sirven también para el C++ Express) porque con la ayuda del Visual C++ Express nunca encuentro lo que busco.

Bueno, la verdad resultó ser algo muy sencillo pero igual lo dejó por aquí, alguien que esté acostumbrado a programar con Delphi y que no conozca los pormenores del api de Windows o bien los conozca pero se le hayan olvidado por el paso del tiempo le puede ser útil esta información.

Saludos.

JHAx86

Reputación



Hacer una pregunta

Boletín de Noticias

Reciba noticias de tecnología, tips de reparación y ofertas exclusivas.



Reglamento / P+F

Foros

Miembros / Expertos