Бесконечный цикл и выполнить запуск метода один раз при обнаружение

78
01 июля 2021, 00:00

Пытаюсь сделать программу которая будет отслеживать запуск определённых процессов, если какой-то процесс запустился отследить его и запустить метод (функции) Затем если процессы закрылись продолжать искать появление нужных процессов, и.т.п

Для одного поиска сделал так:

IntPtr ptr = WinAPI.FindWindow(null, "notepad");
while (ptr == IntPtr.Zero) 
{
    if (ptr == IntPtr.Zero)  
    { 
       Console.WriteLine("окно не найдено"); 
       // Если окно не нашли то возвращаемся к поиску.
    }
    else 
    { 
       Если нашли то делаем что либо:
       Console.WriteLine("окно найдено"); 
       StringBuilder st = new StringBuilder(100); 
       Console.WriteLine(st.ToString()); 
    } 
}

Для списка же процессов добавил List<string> со списком процессов которые нужно проверять на запуск через FindWindow.

private static readonly List<string> App = new List<string>
{
  "Notepad",
  "Notepad++",
  "Блокнот",
  "Word",
};

И в цикле прогоняю их

for (int i = 0; i < App.Count; i++)
{
   IntPtr ptr = WinAPI.FindWindow(null, App[i]);
   while (ptr == IntPtr.Zero)
   {
     if (ptr == IntPtr.Zero)
     {
       Console.WriteLine("окно не найдено");
       Thread.Sleep(500);
       // Если окно не нашли то возвращаемся к поиску.
     }
     Console.WriteLine("окно найдено");
      // Как сделать следующее?
     // Если окно найдено, то Один раз выполнить какое-то действие.
    // И ждать пока окно не закроется.
     //Если окно закрылось возвратиться к поиску.
     var st = new StringBuilder(100);
     Console.WriteLine(st.ToString());
   }
}

Вопрос: Как сделать запуск функции метода один раз за проходы в цикле for ?

И ещё если окон нет запущенных то он всё равно пишет что окно найдено ( скрин )

Как это исправить?

Answer 1
List<IntPtr> pointers = new List<IntPtr>();
for (int i = 0; i < App.Count; i++)
  pointers.Add(IntPtr.Zero);
while (true) {
  for (int i = 0; i < App.Count; i++)
  {
    IntPtr ptr = WinAPI.FindWindow(null, App[i]);
    Console.WriteLine(ptr == IntPtr.Zero? "окно не найдено: {0}" : "окно найдено: {0}", App[i]);
    if (pointers[i] != ptr) {
      if (ptr != IntPtr.Zero && pointers[i] != IntPtr.Zero)
        Console.WriteLine("  process restarted");
      else if (ptr == IntPtr.Zero)
        Console.WriteLine("  process ended");
      else if (pointers[i] == IntPtr.Zero)
        Console.WriteLine("  process started");
      pointers[i] = ptr;
    }
  }
  Thread.Sleep(1000);
}
READ ALSO
Как сделать полу рандомную анимацию?

Как сделать полу рандомную анимацию?

Как сделать так, чтоб сначала проигрывалась анимация по одному, а иногда немного по другому

114
Смещение элемента массива плавно вниз Консоль [дубликат]

Смещение элемента массива плавно вниз Консоль [дубликат]

Подскажите как сделать, что бы масив начиная с последнего элемента, плавно опускался вниз и исчезал? Принцип тетриса, но реализовать не получаеться

70
Получение каждой цифры отдельно из строки

Получение каждой цифры отдельно из строки

как можно брать цифры в строке полученную из базы "1,5,7" засунуть их в переменные или как то еще лучше чтоб типа в цикле поставить на каждую...

94
Избежать дублирования запроса SQL

Избежать дублирования запроса SQL

Доброго времени сутокНе знаю, стоило ли сюда писать весь код, но я думаю, так будет нагляднее(а может и нет) Есть такой код, он выполняет нужную...

82