Эй, есть ли способ повысить событие при запуске нового процесса без использования ManagementEventWatcher и без использования Process.GetProcesses()? Проблема с ManagementEventWatcher заключается в том, что пользователь должен иметь высокие требования. Спасибо!
С# Поднять событие при запуске нового процесса
Ответ 1
В отличие от внешнего события Win32_ProcessStartTrace
, которое вы используете в настоящее время, встроенные события __InstanceCreationEvent
и __InstanceDeletionEvent
WMI не требуют прав администратора.
Здесь пример запроса, который вы можете использовать для отслеживания процесса, начинается:
SELECT TargetInstance
FROM __InstanceCreationEvent WITHIN 1
WHERE TargetInstance ISA 'Win32_Process'
AND TargetInstance.Name LIKE '<your process name.exe>'
Дополнительная информация: Информация о технологиях и уведомления с использованием WMI
Поскольку они являются внутренними событиями, WMI в конечном итоге имитирует поведение событий посредством опроса и будет проверять новые события только периодически (здесь, каждые 1 секунду). Уменьшение продолжительности WITHIN
до нескольких секунд даст вам более быстрый ответ за счет использования ЦП.
Ответ 2
Должно быть возможно выяснить, когда приложение в последний раз выполнялось путем настройки отслеживания процессов аудита в Windows. Следующие ссылки могут помочь вам:
Как я могу отслеживать, какие программы поступают на мою машину?
Отслеживание процесса будет создавать записи в журнале событий Windows, доступ к которым вы можете получить с помощью С#.
Ссылка: .NET Process Monitor
Ответ 3
Странная вещь - приложение не нужно создавать окно в окнах. Процесс создания может не принадлежать оконной станции, над которой вы работаете. В любом случае вам нужно будет найти окна этого процесса, и вам также необходимо будет обнаружить новые и закрытые окна всех процессов.
Таким образом, перечисляемые окна намного более чистые/легкие.
Попробуйте EnumChildWindows
функцию на десктопе дескриптора (получена GetDesktopWindow
), чтобы найти окна приложений верхнего уровня. используйте GetWindowThreadProcessId
и EnumThreadWindows
на полученных ручках для обнаружения вспомогательных окон окон.
Нить с низким приоритетом выполнит задание.
Ответ 4
Вы, вероятно, можете использовать EnumDesktopWindows из user32.dll, вы получите все дескрипторы окон, вы можете проверить заголовок окна с помощью GetWindowText и тип окна с помощью GetClassName.
Таким образом вы можете скрыть подсказку или сокровище где угодно. (потому что вы получите ручки всех окон (и элементов управления)).
Посмотрите, будет ли этот класс полезен для вас Управляемый глобальный крюк для создания и уничтожения окна
В этой статье кто-то создал хороший класс с легко подключаемыми событиями, вы можете запустить этот код без повышения привилегий.
Как только вы получите дескриптор окна (управления), вы можете добавить текст или нарисовать изображение на нем для подсказок.