Как обнаружить неактивного пользователя - PullRequest
25 голосов
/ 06 февраля 2010

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

Ответы [ 4 ]

42 голосов
/ 06 февраля 2010

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

9 голосов
/ 06 февраля 2010

Возможно, вы захотите увидеть ответ на этот вопрос: Как узнать, когда Windows неактивна [1] Это в основном тот же вопрос, решение которого заключается в использовании GetLastInputInfo [2 ] вызов API.

В этом посте также объясняются некоторые аспекты: (The Code Project) Как проверить отсутствие активности пользователя с вызовами платформы и без нее в C # [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

6 голосов
/ 06 февраля 2010

Ваше приложение получит сообщение WM_SYSCOMMAND с SC_SCREENSAVE в качестве идентификатора команды, когда Заставка вот-вот включится. Будет ли это делать? есть также идентификатор команды SC_MONITORPOWER, когда монитор почти пуст (также сообщение WM_SYSCOMMAND).

Редактировать: просматривая комментарии, вы обнаружите, что вам не важно, является ли пользователь инициативным, а, скорее, неактивно ли ваше приложение .

Это просто. Если ваше приложение свернуто, то пользователь не взаимодействует с ним. Если ваше приложение не является приложением переднего плана, это также хороший инициатор.

Вы также можете обратить внимание на сообщения в вашем насосе, чтобы заметить, были ли какие-либо пользовательские сообщения ввода в ваше приложение. В C ++ добавление кода в насос тривиально, в delphi вы можете использовать ловушку WH_GETMESSAGE для мониторинга насос подключается к циклу сообщений, который реализует TApplication. Или GetLastInputInfo

1 голос
/ 13 апреля 2012

Это SecondsIdle не работает вообще. Можно использовать TTimer в сочетании со второй переменной, которая сбрасывается каждый раз, когда пользователь вводит мышь или клавиатуру.

...