2008-09-26 10 views
5

Necesito enumerar todas las aplicaciones en ejecución. En particular, todas las ventanas superiores. Y para cada ventana necesito agregar mi artículo personalizado al menú del sistema de esa ventana.Cómo agregar un elemento personalizado al menú del sistema en C++?

¿Cómo puedo lograr eso en C++?

Actualización.

Estaría más que feliz de tener una solución para Windows, MacOS y Ubuntu (aunque no estoy seguro si MacOS y Ubuntu tienen algo así como 'menú del sistema').

+0

¿Cuál es el sistema operativo de destino? ¿Windows? –

Respuesta

1

Una vez que tenga mango de nivel superior de otra ventana, es posible que pueda llamar GetMenu() para recuperar el menú Sistema de la ventana y luego modificarlo, por ejemplo:

HMENU hMenu = GetMenu(hwndNext); 
+0

Creo que se refería a GetSystemMenu, no a GetMenu; ver mi respuesta. – efotinis

0

Puede utilizar EnumWindows() enumerar nivel superior de Windows.

No tengo una respuesta específica para la segunda parte de su pregunta, pero si subclase la ventana, me imagino que puede modificar el menú del sistema.

EDIT: o hacer lo que dijo Chris: llamar GetMenu()

0

Re: la actualización - Tenga en cuenta que ni siquiera Microsoft Windows requiere Windows tener un menú Sytem. GetMenu() puede devolver 0. También deberá interceptar la creación de la ventana, ya que cada nueva ventana superior presumiblemente también lo necesita.

Además, lo que usted propone es bastante intrusivo para otras aplicaciones. ¿Cómo se asegurarán de que no se rompan cuando modifique sus menús? ¿Y cómo vas a asegurarte de suprimir los mensajes? En particular, ¿cómo se asegurará de que los intercepte antes de que nadie más los vea? Para citar a Raymond Chen, imagine lo que sucedería si dos programas lo intentaran.

8

Para Windows, otra manera de conseguir las ventanas de nivel superior (además EnumWindows, que utiliza una devolución de llamada) es conseguir el primer hijo del escritorio y luego recuperar todos sus hermanos:

HWND wnd = GetWindow(GetDesktopWindow(), GW_CHILD); 
while (wnd) { 
    // handle 'wnd' here 
    // ... 
    wnd = GetNextWindow(wnd, GW_HWNDNEXT); 
} 

cuanto a obtener el sistema menú, utilice la función GetSystemMenu, con FALSE como segundo argumento. El GetMenu mencionado en las otras respuestas devuelve el normal menú de la ventana.

Tenga en cuenta, sin embargo, que al agregar un elemento de menú personalizado a la ventana de un proceso extraño es fácil, responder a la selección de ese elemento es un poco complicado. Deberá insertar algún código en el proceso para poder crear una subclase de la ventana, o instalar un enlace global (probablemente un tipo WH_GETMESSAGE o WH_CBT) para monitorear los mensajes WM_SYSCOMMAND.

+0

¡Su respuesta acaba de hacer mi día (en realidad la noche)! Nunca leí sobre WH_CBT y después de ver tu publicación lo hice, ahora puedo interceptar con éxito (a través del código insertado) WM_SYSCOMMAND de otro proceso. – foxx1337

Cuestiones relacionadas