Windowsアプリケーションで非アクティブな(アイドル状態の)ユーザーを検出するにはどうすればよいですか?ユーザーからの入力(キーボード、マウス)が一定時間ない場合、アプリケーションをシャットダウンしたいと思います。
4 に答える
ユーザーのアイドル時間を追跡するには、キーボードとマウスのアクティビティをフックできます。ただし、システム全体のメッセージ フックをインストールすることは非常に侵襲的な作業であり、フック DLL をすべてのプロセスにロードする必要があるため、可能であれば避ける必要があることに注意してください。
もう 1 つの解決策は、GetLastInputInfo
API 関数を使用することです (アプリケーションが 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呼び出しを使用することです。
この投稿では、いくつかの側面についても説明しています。(コードプロジェクト)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
スクリーンセーバーが起動しようとすると、アプリケーションはコマンドIDとしてWM_SYSCOMMAND
メッセージを受け取ります。SC_SCREENSAVE
モニターがブランクになりそうなときのコマンドIDもありSC_MONITORPOWER
ます(これもWM_SYSCOMMANDメッセージです)。
編集:コメントを見ると、ユーザーが非アクティブであるかどうかではなく、アプリケーションが非アクティブであるかどうかを気にしないようです。
これは簡単。アプリが最小化されている場合、ユーザーはアプリを操作していません。アプリがフォアグラウンドアプリケーションでない場合は、それも優れた指標です。
また、ポンプ内のメッセージに注意を払って、アプリにユーザー入力メッセージがあったかどうかを確認することもできます。C++では、ポンプにコードを追加するのは簡単です。デルファイでは、WH_GETMESSAGEフックを使用して、メッセージへのポンプフックを監視できます。 TApplicationが実装するループ。またはGetLastInputInfo
この SecondsIdle はまったく機能しません。その方法は、ユーザーがマウスまたはキーボードを入力するたびにリセットされる 2 番目の変数と組み合わせて TTimer を使用することです。