Pregunta

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 Vista usa para el menú ALT-TAB, como en esta imagen:

 alt-tab

Supongo que tendré que usar pinvokes porque realmente no parece que haya bibliotecas para hacerlo. ¿Alguna idea?

¿Fue útil?

Solución

Este artículo debería decirte exactamente qué hacer, muestra cómo construir tu 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 la API PrintWindow para obtener las vistas previas en XP.

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

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

Otros consejos

Desde una perspectiva API (Win32), no existen las tareas (al menos no las 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 esos, debe enumere las ventanas (aquí está el PInvoke para eso).

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.

@ abelenky17

Sospecho que esto no cubrirá todos los casos, por ejemplo, hay procesos que tienen varias ventanas de nivel superior (que 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á el escenario de Sesiones de Terminal correctamente (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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top