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