Как обнаружить неактивного (неактивного) пользователя в Приложении Windows? Я хотел бы завершить работу приложения, когда не было никакого входа (клавиатура, мышь) от пользователя в течение определенного промежутка времени.
Чтобы отслеживать время бездействия пользователя, вы можете перехватить активность клавиатуры и мыши. Обратите внимание, однако, что установка общесистемной ловушки сообщений - это очень инвазивная вещь, и ее по возможности следует избегать, так как она потребует, чтобы ваша 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;
Возможно, вы захотите увидеть ответ на этот вопрос: Как определить, когда 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
Ваше приложение получит сообщение WM_SYSCOMMAND
с SC_SCREENSAVE
в качестве идентификатора команды, когда Screen Saver вот-вот начнет работать. Сойдёт ли это? Также существует команда SC_MONITORPOWER
в качестве идентификатора команды, когда монитор вот-вот будет пустым (также сообщение WM_SYSCOMMAND).
Правка: глядя на комментарии, кажется, что вас не волнует, является ли user неактивным, а скорее то, является ли ваше приложение неактивным.
Это просто. Если ваше приложение свернуто, то пользователь с ним не взаимодействует. Если ваше приложение не является приоритетным приложением, это также хороший инициалист.
Вы также можете обратить внимание на сообщения в вашем насосе, чтобы заметить, если в вашем приложении были пользовательские входные сообщения. В C++ добавление кода в насос тривиально, в delphi вы можете использовать перехватчик WH_GETMESSAGE для отслеживания перехвата насоса в цикл сообщений, который реализует TApplication. Или GetLastInputInfo