В любом случае, чтобы узнать, что текущая 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
Перезвоните.
Я надеюсь, что все это имеет смысл:)