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

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

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

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

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

1 Ответ

1 голос
/ 18 мая 2010

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

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

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

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

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

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