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

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

27
задан Harriv 6 February 2010 в 10:37
поделиться

3 ответа

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

45
ответ дан 28 November 2019 в 04:42
поделиться

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

В этой заметке также объясняются некоторые аспекты: (The Code Project) How to check for user inactivity with and without platform invokes in C# [3]

[1] How to tell when Windows is notactive
[2] http://msdn.microsoft.com/en-us/library/ms646302%28VS.85%29.aspx
[3] http://www.codeproject.com/KB/cs/uim.aspx

10
ответ дан 28 November 2019 в 04:42
поделиться

Ваше приложение получит сообщение WM_SYSCOMMAND с SC_SCREENSAVE в качестве идентификатора команды, когда Screen Saver вот-вот начнет работать. Сойдёт ли это? Также существует команда SC_MONITORPOWER в качестве идентификатора команды, когда монитор вот-вот будет пустым (также сообщение WM_SYSCOMMAND).

Правка: глядя на комментарии, кажется, что вас не волнует, является ли user неактивным, а скорее то, является ли ваше приложение неактивным.

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

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

.
7
ответ дан 28 November 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: