Как узнать, пропало ли окно? - PullRequest
2 голосов
/ 14 августа 2011

Я хотел бы знать, могу ли я получить какое-либо сообщение о том, что определенное открытое окно исчезло?

Очистить: я открываю блокнот, набираю текст, затем закрываю его. Я хотел бы, чтобы моя программа на C # отображала сообщение о том, что мое окно исчезло. Я новичок в C #, поэтому, пожалуйста, предложите класс или классы, которые мне могут понадобиться, или лучше предоставить краткий пример, чтобы продемонстрировать основную задачу. Я очень благодарен за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 14 августа 2011

Когда @Richard указывает, вам нужно FindWindow(), чтобы посмотреть любое окно. В случае с Блокнотом вы можете сделать это проще, поскольку блокнот процесс завершается, как только окно исчезает.

Вы можете запустить блокнот с помощью Process.Start() и использовать событие Exited в возвращенном объекте Process для запуска кода после завершения работы блокнота:

Process notepad = Process.Start("Notepad", "c:\temp\text.txt");
notepad.Exited += MyExitEventHandler;
1 голос
/ 14 августа 2011

Грязным, но рабочим способом будет опрос текущих запущенных процессов с помощью таймера, сравнивая список с процессами, которые выполнялись в предыдущем проведенном вами опросе.

Сначала добавьте такой член класса для хранения процессов для последующего сравнения:

List<string> lastRunningProcesses = new List<string>();

Тогда для начала опроса есть такой код:

System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 500; //half a second
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Start();

И, наконец, это код опроса и сравнения:

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    List<string> currentlyRunningProcesses = System.Diagnostics.Process.GetProcesses().ToList().ConvertAll(p => p.ProcessName);
    if (lastRunningProcesses.Count > 0)
    {
        List<string> closedProcesses = lastRunningProcesses.FindAll(p => !currentlyRunningProcesses.Contains(p));
        if (closedProcesses.Count > 0)
            MessageBox.Show(string.Format("{0} process(es) have been closed:\n{1}", closedProcesses.Count, string.Join("\n", closedProcesses)));
    }
    lastRunningProcesses = currentlyRunningProcesses;
}

Пока ваше приложение будет работать, оно будет продолжать опрос.

1 голос
/ 14 августа 2011

Для этого вам нужно будет использовать interop.Создайте таймер, который вызывает функцию FindWindow win32 .

Когда это останавливает поиск окна, окно исчезает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...