В любом случае, чтобы узнать, что текущая Windows находится в режиме блокировки?

У меня есть приложение для Windows, написанное на VS 2005. Приложение делает запросы к базе данных SQL в цикле таймера каждые 2 минуты. Если какие-либо данные изменятся, окно будет обновлено новыми данными.

Если пользователь покидает окно, через некоторое время окна будут автоматически заблокированы. Нет смысла продолжать запрашивать данные каждые 2 минуты, когда окна заблокированы; поэтому я хотел бы остановить запрос при включенной блокировке, чтобы уменьшить трафик сетевых данных, а также сохранить текущие ресурсы Windows, такие как память и процессоры.

Я не уверен, есть ли какой-нибудь способ узнать, заблокированы ли текущие окна? Не уверены, что для этой цели есть какие-либо API-интерфейсы Windows, если нет доступных классов.Net?

Мой проект в.Net 2.0, и все пользователи в Windows XP.

1 ответ

Решение

Вы на самом деле не хотите запрашивать, заблокированы ли окна, вместо этого вы хотите узнать, является ли ваше приложение видимым - нет смысла обновлять ваши данные, если окно свернуто или закрыто другим окном, верно?

Стандартный способ сделать это - использовать таймер и сделать окно недействительным. Используйте класс Timer, чтобы запланировать таймер на 2 минуты в будущем. Когда таймер срабатывает, сделайте недействительным ваше окно через Form.Invalidate ().

Когда вы сделаете недействительным окно, Windows отправит ему сообщение "рисовать". в OnPaint обработчик, вы обновляете экран своими данными. Но вот кикер: если ваше окно не видно, Windows не будет запускать OnPaint событие (в том числе, если экран в настоящее время заблокирован)!

Теперь ваш запрос к базе данных, вероятно, слишком дорого для выполнения в OnPaint обработчик событий, так что вам, возможно, придется сделать что-то хитрое в вашем обработчике таймера. Например, вы можете выполнить запрос к базе данных в вашем обработчике таймера, а затем вызвать Form.Invalidate(), Это означает, что когда вы возвращаетесь с блокировки экрана, ваши данные могут быть устаревшими, поэтому вы можете проверить, DateTime.Now значительно отличается между обработчиком таймера и OnPaint обработчик и планировать другой таймер сразу, если это так. В противном случае запланируйте повторный запуск таймера через 2 минуты после OnPaint Перезвоните.

Я надеюсь, что все это имеет смысл:)

Другие вопросы по тегам