2009-04-11 12 views
13

Me gustaría poder ocultar la ventana de otra aplicación desde la barra de tareas, sin ocultar la ventana. Específicamente, quiero tener varios navegadores web diferentes en ejecución, visibles, disponibles en la lista Alt + Tab, pero sin ocupar espacio en la barra de tareas.Ocultar el botón de la barra de tareas de otra aplicación

(Si alguien tiene curiosidad, ¿por qué ?: He escrito una aplicación de tablero que usa las API DwmRegisterThumbnail de Vista para mostrar vistas previas en vivo de varias ventanas a la vez - una especie de "imagen en imagen", si lo desea. también tener botones de la barra de tareas para esas ventanas parece redundante.)

Soy consciente de que cambiar el estilo de la otra ventana para incluir WS_EX_TOOLWINDOW lo ocultará de la barra de tareas, y lo intenté primero. Pero, como era de esperar, tenía algunos efectos secundarios que no quería: la barra de título se hizo más corta (no del todo mal, supongo) y los botones de minimizar y maximizar desaparecieron (no son buenos). También tuve que esconder y volver a mostrar la ventana para que la barra de tareas reconociera el cambio, lo que causó que se repinvieran los artefactos cuando lo hice en IE Windows.

Mi siguiente pensamiento fue que, dado que las ventanas con los propietarios están ocultas de la barra de tareas por defecto, tal vez podría cambiar las otras ventanas para que sean propiedad del mío. Pero MSDN es pretty clear que "[después de crear una ventana propia, una aplicación no puede transferir la propiedad de la ventana a otra ventana".

Encontré this question que tiene una redacción similar a la mía, pero se trata específicamente de las ventanas de su propio proceso, donde tiene control total sobre la propiedad de la ventana.

¿Alguien sabe de alguna otra manera de ocultar un botón de la barra de tareas, que funcionará para Windows desde otro proceso?


Actualización: Tormod me puso en el camino correcto con ITaskbarList - funciona muy bien. La página de pinvoke.net tenía algunos errores (GUID incorrecto, métodos declarados alfabéticamente en lugar de orden de interfaz), pero lo edité, hice correcciones y también agregué un ejemplo de cómo crear una instancia de ITaskbarList a través de su coclass.

Actualización 2: Si utiliza DeleteTab para ocultar botón de la barra de tareas de una ventana, y luego hacer que la ventana activa (por ejemplo a través de SetForegroundWindow o Alt + Tab), el botón de la barra de tareas volverá a aparecer. Para mantener oculto el botón de la barra de tareas, tuve que agregar un temporizador y continuar llamando a DeleteTab. Siempre y cuando no te importe que el botón de la barra de tareas vuelva a aparecer brevemente cada vez que se enfoca la ventana, esto funciona bien.

Respuesta

6

De MSDN:

versión 4.71 y posterior de Shell32.dll añade la capacidad de modificar el contenido de la barra de tareas. Desde una aplicación, ahora puede agregar, eliminar y activar los botones de la barra de tareas. Activar el elemento no activa la ventana; muestra el elemento tal como está presionado en la barra de tareas.

Las capacidades de modificación de la barra de tareas se implementan en un objeto del Modelo de objetos componentes (COM) (CLSID_TaskbarList) que expone la interfaz ITaskbarList (IID_ITaskbarList). Debe llamar al método ITaskbarList :: HrInit para inicializar el objeto. A continuación, puede utilizar los métodos de la interfaz ITaskbarList para modificar el contenido de la barra de tareas.

Parece que la interoperabilidad COM es el camino a seguir para manipular de forma confiable los contenidos de la barra de tareas.En particular, lo que tendría que llamar a las siguientes funciones:

Usted puede encontrar la firma de C# para la interfaz ITaskbarList en pinvoke.net: ITaskbarList.

+0

Sweet - Nunca supe esto, pero suena como el boleto. ¡Gracias! –

0

¿Has intentado eliminar WS_EX_APPWINDOW?

+0

Sí, lo hice. Eso solo funciona si la otra aplicación tuvo que agregar 'WS_EX_APPWINDOW' en primer lugar, p. si tuviera una ventana de propietario Las ventanas ordinarias de nivel superior no necesitan 'WS_EX_APPWINDOW', por lo que no están ahí para eliminarlas. –

Cuestiones relacionadas