Пытаюсь сделать программу которая будет отслеживать запуск определённых процессов, если какой-то процесс запустился отследить его и запустить метод (функции) Затем если процессы закрылись продолжать искать появление нужных процессов, и.т.п
Для одного поиска сделал так:
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 ?
И ещё если окон нет запущенных то он всё равно пишет что окно найдено ( скрин )
Как это исправить?
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);
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости