Есть ли способ в .net узнать, какие окна открыты, не прибегая к PInvoke? Это немного отличается от вопроса о том, какие приложения работают в памяти. Например, Firefox может быть запущен, но может иметь более одного окна. По сути, я просто хочу получить ту же информацию, что и панель задач (и alt-tab?).
Кроме того, если у меня есть ссылка на окно, есть ли способ программно передать ему фокус?
Есть ли способ сделать это с помощью управляемого кода?





Боюсь, без PInvoke это невозможно. Чтобы сфокусироваться на каком-либо окне, вы должны вызвать функцию SetForegroundWindow, подробности см. В статье это.
Вы можете ознакомиться с новым материалом Автоматизация пользовательского интерфейса в .NET 3.5. Предполагается, что он маскирует множество вещей PInovke и работает с веб-приложениями и WPF-приложениями.
Я еще не использовал его, поэтому у меня нет более конкретного места, чтобы направить вас, но он может соответствовать всем требованиям.
Посмотрите этот проект LGPL. Я знаю, что он может установить передний план для окна. В остальном аку правильный. Скорее всего, это потребует некоторых вызовов pinvoke.
http://mwinapi.sourceforge.net/
Если вам нужна информация об использовании pinvoke: