Проверьте это:
var openWindowProcesses = System.Diagnostics.Process.GetProcesses()
.Where(p => p.MainWindowHandle != IntPtr.Zero && p.ProcessName != "explorer");
openWindowProcesses
должен содержать все открытые приложения, для которых у них есть активное главное окно.
Я помещаю p.ProcessName != "explorer"
в выражение where, потому что проводникявляется основным процессом рабочего стола, и его никогда не следует закрывать.
Для наблюдения за выполнением процессов вы можете использовать класс ManagementEventWatcher
.Смотрите это пожалуйста.