Как обнаружить неактивного (незанятого) пользователя в приложении Windows? Я хотел бы отключить приложение, если в течение определенного периода времени пользователь не вводил (клавиатуру, мышь) пользователя.
Как обнаружить неактивного пользователя
Ответ 1
Чтобы отслеживать время простоя пользователя, вы можете подключить клавиатуру и мышь. Обратите внимание, однако, что установка общесистемного сообщения является очень сложной задачей, и ее следует избегать, если это возможно, поскольку она потребует, чтобы ваша загрузочная DLL-память была загружена во все процессы.
Другим решением является использование функции API GetLastInputInfo
(если ваше приложение запущено на машинах Win2000 (и выше)).
GetLastInputInfo
извлекает время (в миллисекундах) последнего события ввода (когда получена последняя обнаруженная активность пользователя, будь то с клавиатуры или мыши).
Вот простой пример. Функция SecondsIdle
возвращает число секунд без активности пользователя (вызывается в событии OnTimer
компонента TTimer
).
~~~~~~~~~~~~~~~~~~~~~~~~~
function SecondsIdle: DWord;
var
liInfo: TLastInputInfo;
begin
liInfo.cbSize := SizeOf(TLastInputInfo) ;
GetLastInputInfo(liInfo) ;
Result := (GetTickCount - liInfo.dwTime) DIV 1000;
end;
procedure TForm1.Timer1Timer(Sender: TObject) ;
begin
Caption := Format('System IDLE last %d seconds', [SecondsIdle]) ;
end;
Ответ 2
Возможно, вам захочется увидеть ответ на этот вопрос: Как сказать, когда Windows неактивна [1], это в основном тот же вопрос, решение которого - использовать GetLastInputInfo
[2] API-вызов.
В этом сообщении также объясняются некоторые аспекты: (Проект кода) Как проверить бездействие пользователя с и без вызова платформы в С# [3]
[1] Как сказать, когда Windows неактивна
[2] http://msdn.microsoft.com/en-us/library/ms646302%28VS.85%29.aspx
[3] http://www.codeproject.com/KB/cs/uim.aspx
Ответ 3
Ваше приложение получит сообщение WM_SYSCOMMAND
с SC_SCREENSAVE
в качестве идентификатора команды, когда Заставка будет готова к работе. Будет ли это делать? там также идентификатор команды SC_MONITORPOWER
, когда монитор близок к пустому (также сообщение WM_SYSCOMMAND).
Изменить: глядя на комментарии, кажется, что вас не волнует, является ли пользователь инициативным, а скорее является ли ваше приложение неактивным.
Это легко. Если ваше приложение сведено к минимуму, пользователь не взаимодействует с ним. Если ваше приложение не является приоритетным приложением, это также хороший идентификатор.
Вы также можете обратить внимание на сообщения в своем насосе, чтобы заметить, были ли какие-либо пользовательские входные сообщения для вашего приложения. В С++ добавление кода к насосу тривиально, в delphi вы можете <нанести удаp > использовать крюк WH_GETMESSAGE для контроля нажимать насос в контур сообщения, который реализует TApplication. Или GetLastInputInfo
Ответ 4
Это SecondsIdle не работает вообще. Путь заключается в использовании TTimer в сочетании со второй переменной, которая сбрасывается каждый раз, когда пользователь вводит мышь или клавиатуру.