30

Windowsアプリケーションで非アクティブな(アイドル状態の)ユーザーを検出するにはどうすればよいですか?ユーザーからの入力(キーボード、マウス)が一定時間ない場合、アプリケーションをシャットダウンしたいと思います。

4

4 に答える 4

49

ユーザーのアイドル時間を追跡するには、キーボードとマウスのアクティビティをフックできます。ただし、システム全体のメッセージ フックをインストールすることは非常に侵襲的な作業であり、フック DLL をすべてのプロセスにロードする必要があるため、可能であれば避ける必要があることに注意してください。

もう 1 つの解決策は、GetLastInputInfoAPI 関数を使用することです (アプリケーションが Win2000 (およびそれ以降) のマシンで実行されている場合)。 GetLastInputInfo最後の入力イベントの時間 (ミリ秒単位) を取得します (最後に検出されたユーザー アクティビティがキーボードまたはマウスから受信されたとき)。

簡単な例を次に示します。この関数は、ユーザー アクティビティがない (コンポーネントのイベントでSecondsIdle呼び出される) 秒数を返します。OnTimerTTimer

~~~~~~~~~~~~~~~~~~~~~~~~~
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

于 2010-02-06T10:55:29.197 に答える
11

この質問への答えを見たいと思うかもしれません: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

于 2010-02-06T10:45:10.713 に答える
7

スクリーンセーバーが起動しようとすると、アプリケーションはコマンドIDとしてWM_SYSCOMMANDメッセージを受け取ります。SC_SCREENSAVEモニターがブランクになりそうなときのコマンドIDもありSC_MONITORPOWERます(これもWM_SYSCOMMANDメッセージです)。

編集:コメントを見ると、ユーザーが非アクティブであるかどうかではなく、アプリケーションが非アクティブであるかどうかを気にしないようです。

これは簡単。アプリが最小化されている場合、ユーザーはアプリを操作していません。アプリがフォアグラウンドアプリケーションでない場合は、それも優れた指標です。

また、ポンプ内のメッセージに注意を払って、アプリにユーザー入力メッセージがあったかどうかを確認することもできます。C++では、ポンプにコードを追加するのは簡単です。デルファイでは、WH_GETMESSAGEフックを使用して、メッセージへのポンプフックを監視できます。 TApplicationが実装するループ。またはGetLastInputInfo

于 2010-02-06T10:39:55.967 に答える
3

この SecondsIdle はまったく機能しません。その方法は、ユーザーがマウスまたはキーボードを入力するたびにリセットされる 2 番目の変数と組み合わせて TTimer を使用することです。

于 2012-04-13T15:07:43.230 に答える