Michael Breeden Ответов: 1

Обнаружение времени простоя формы выигрыша для выполнения выхода из системы


Я надеюсь, что это правильное место для этого вопроса.
Мне нужно выйти из приложения Win Form после того, как пользователь не будет активен в течение [300] секунд. Я видел много решений, включая обнаружение состояния простоя, последнюю активность и этот действительно сложный компонент здесь - Обнаружение времени простоя формы выигрыша для выполнения выхода из системы так же как Определение От Безделья
Во второй статье, однако, был комментарий Сара Кулу это показало очень простой способ сделать то же самое. Это так просто, что беспокоит меня. Я протестировал его в приложении MDI. Он отлично работает, когда есть/нет активность на форме и игнорирует активность вне нее. Это слишком просто. Может ли кто-нибудь предложить какие-либо проблемы с этим?

DateTime dtLastIdleTime = DateTime.Now;
protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    dtLastIdleTime = DateTime.Now;
}

private void timer1_Tick(object sender, EventArgs e)
{
    appendToFile("\r\nTimer Says:" + DateTime.Now.ToLocalTime() + "..." + dtLastIdleTime.ToLocalTime() + "...");
}


Что я уже пробовал:

Я попробовал это, и это сработало чудесно. Если кто-то может сказать мне, в чем проблема, я должен буду попробовать один из других более сложных методов... Как это?

1 Ответов

Рейтинг:
1

OriginalGriff

WndProc вызывается не только тогда, когда ваш пользователь что - то делает-он вызывается всякий раз, когда в Windows происходит что-то, что может повлиять на ваше приложение. Например, если вы переместите другое приложение так, чтобы оно отображалось - даже частично, - то WndProc будет вызван для перекраски вашего дисплея. Черт возьми, если мышь пересекает приложение, WndProc будет вызван!

Это не очень хороший индикатор "пользователь использует мое приложение"! Вам нужно следить за фактической активностью, а не просто "что-то произошло в windows".


Michael Breeden

Видимо, из-за меня произошло недоразумение. Моя цель состоит в том, чтобы вывести человека из приложения, если он не использует компьютер - "активность пользователя", что, по - видимому, является проблемой безопасности, - а не если он не использует приложение. Если они все еще используют компьютер, я ожидаю, что это тот же самый человек. Меня беспокоит, если они уйдут от компьютера или забудут его где-нибудь. Если они используют его для чего-то еще, кроме моего приложения, я предполагаю, что они все еще владеют машиной. Если машина не используется ... тогда я хочу выйти из системы.
Есть ли еще какой-то недостаток в использовании этого кода?

OriginalGriff

Ну да - если то, что они делают с компьютером, не влияет на ваше приложение (скажем, написание письма или просмотр интернета), то WndProc ничего не получит. Он получает только сообщения о том, что что-то влияет на ваше приложение, помните?
Если вы смотрите на это с точки зрения безопасности, то вам нужно искать более надежные средства обнаружения - и это, вероятно, означает, что вы должны смотреть на глобальные крючки в клавиатуре и мыши. Это не невозможно в C# - Google найдет для вас примеры, - но это не тривиально,и с этим нужно обращаться правильно, иначе вы можете разбить всю систему.
Кроме того, создайте экранную заставку, которая заставит ваше приложение выйти из системы, когда оно будет активировано? Не безопасно, в том смысле, что пользователь может отключить экранную заставку - но проще, чем зацепить для разработки.