process.MainWindowHandle != IntPtr.Zero; , но эта проверка жрет очень много ресурсов, хз почему
уверен что из-за этого:?
Ну профилировщик ссылается на это, дело в том что я циклом проверяю есть ли окно у процесса
Попробуй проверку переписать на winapi. Получай список хендлеров процессов (с помощью winapi) и с помощью IsWindow (помоему так называется) проверять, если у процесса с этим хенделером окно. Мб быстрее будет.
Так а на шарпе не такая же реализация?
Это надо смотреть как реализован getProcesses и что происходит при создании инстанса процесса. Там куча свойств, тамещто. Мб конечно они ленивые
Попробуй дёргать соответствующий winapi руками. Было замечено, что в коде стдлибы довольно много лишнего кода в районе работы с процессами. Если winapi всё ещё будет медленно, то параллелить.
Попробовал с помощью EnumProcesses из Psapi.dll, но получилось еще более затратно, ибо нужно получить и имя и хендлер
Тебе нужно получить имена всех возможно открытых окон или только уже открытых окон? Можно тамещто через EnumWindow получить все хендлеры всех окон, а потом получить PID всех процессов которым эти окна принадлежат через GetWindowThreadProcessId И чём мне кажется, но я не уверен, что будет быстрее.
Мне нужны открытые окна
Обсуждают сегодня