icon c# .net taskbar task

icon tray c#



C#- Obtener lista de tareas abiertas (4)

Estoy tratando de encontrar una manera de obtener las tareas abiertas en C #. He estado buscando en google y solo puedo encontrar cómo obtener una lista de los procesos . Quiero las únicas tareas que aparecerían en la barra de tareas.

Además, junto con eso, sería genial si pudiera obtener el proceso al que está asociada la tarea. Y, si es posible, obtenga las imágenes en miniatura que utiliza Vista para el menú ALT-TAB, como en esta imagen:

Supongo que tendré que usar pinvokes porque realmente no parece que haya bibliotecas para hacer esto. ¿Algunas ideas?


Desde la perspectiva de una API (Win32) no hay tareas como Tareas (al menos no la que muestra el Administrador de tareas de Windows / Alt-Tab).

Esas "Tareas" son en realidad ventanas de nivel superior.

Entonces, para obtener una lista de ellos, debe enumerar las ventanas (aquí está el PInvoke para ello).

Luego, observe el estilo de las ventanas para determinar si en realidad son ventanas de nivel superior.


No lo he probado, pero sospecho algo como esto:

using System.Diagnostics; static void MyFunc() { Process[] processes = Process.GetProcesses(); foreach(Process p in processes) { if (p.MainWindowHandle != 0) { // This is a GUI process } else { // this is a non-GUI / invisible process } } }

El punto es verificar cada proceso para un WindowHandle.


Este artículo debería decirle exactamente qué hacer, muestra cómo crear su propio interruptor de tareas e incluye el código necesario para enumerar todas las ventanas y determinar si son "tareas" y le muestra cómo usar PrintWindow api para obtener el vistas previas en XP.

http://msdn.microsoft.com/en-us/library/ms997649.aspx

Además, aquí hay una publicación de blog que habla sobre el algoritmo utilizado para determinar qué se muestra en la vista Alt + Tab. Básicamente, debe comprobar WS_EX_APPWINDOW y WS_EX_TOOLWINDOW junto con si la ventana tiene un propietario.


@ abelenky17

Sospecho que esto no cubrirá todos los casos, por ejemplo, hay procesos que tienen varias ventanas de nivel superior (todas aparecen en el administrador de tareas). Considere por ejemplo: FireFox, Windows Explorer, IE, etc ... esas aplicaciones pueden tener múltiples ventanas en el escritorio. Además, no manejará adecuadamente el escenario de Sesiones Terminales (porque enumera todos los procesos que se ejecutan en el sistema).

@Dan C.

Haciendo algo como esto:

p.ProcessName != "explorer"

te parece bien? Huele mal.