Я создаю оболочку [скриншот] (замена рабочего стола). Должно отображаться, работает ли каждый ярлык или нет. Для этого программа ищет ярлыки в списке запущенных процессов:
// 'shortcutsList' is an array of shortcut objects
// each object contains the variables
// 'exec' - path to program
// 'args' - command line arguments
// GetArguments(Process process) returns command line arguments of process
while (true)
{
bool[] shortcutsExecuted = new bool[shortcutsList.Length];
foreach (Process process in Process.GetProcesses())
{
string path = process.MainModule.FileName;
for (int i = 0; i < shortcutsList.Length; i++)
{
if ( (shortcutsList[i].exec == path) &&
( (shortcutsList[i].args == "") || (GetArguments(process) == shortcutsList[i].args)))
{
shortcutsExecuted [i] = true;
}
}
}
}
Конечно, этот бесконечный цикл работы постоянно потребляет некоторые% s процессора . Это не хорошо
, поэтому я пытался вызвать приведенный выше код только тогда, когда любой процесс запускается или останавливается:
// processListChanged event executes code above
ManagementEventWatcher startProcWatcher = new ManagementEventWatcher(
new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
startProcWatcher.EventArrived += new EventArrivedEventHandler(processListChanged);
startProcWatcher.Start();
ManagementEventWatcher stopProcWatcher = new ManagementEventWatcher(
new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace"));
stopProcWatcher.EventArrived += new EventArrivedEventHandler(processListChanged);
stopProcWatcher.Start();
И это работает довольно хорошо. Теперь программа загружает ЦП только тогда, когда какой-либо процесс запущен или остановлен
Но последний способ требует прав администратора, поэтому он мне не подходит.
Есть ли способ вызвать событие, когда любой процесс запускается или останавливается без прав администратора? Или, может быть, есть лучшее (оптимизированное) решение для отображения, работает ли каждый ярлык или нет?