Подтвердить что ты не робот

Как обнаружить неактивного пользователя

Как обнаружить неактивного (незанятого) пользователя в приложении Windows? Я хотел бы отключить приложение, если в течение определенного периода времени пользователь не вводил (клавиатуру, мышь) пользователя.

4b9b3361

Ответ 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;

http://delphi.about.com/od/adptips2004/a/bltip1104_4.htm

Ответ 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 в сочетании со второй переменной, которая сбрасывается каждый раз, когда пользователь вводит мышь или клавиатуру.