PCが操作されているかを判断する方法

解決


省エネ  2004-09-09 10:21:48  No: 10880

スクリーンセーバーみたいな事をするタスクトレイ常駐アプリを作ってみたい
のですがPCが操作されていない事をどのように判断すると良いのでしょう?
MediaPlayerなどで映画を見てるなどは操作されてない扱いでいいです。


jam  2004-09-09 17:56:43  No: 10881

2000 以降であれば GetLastInputInfo API を使う。
95系は知りませぬ。


省エネ  2004-09-10 06:53:03  No: 10882

偶然、
function LastInput: boolean; 
var LInput : tagLASTINPUTINFO; 
const TIMELIMIT = 10000; 
begin 
   result := false; 
   LInput.cbSize := SizeOf(tagLASTINPUTINFO); 
   GetLastInputInfo(LInput); 
   if (GetTickCount - LInput.dwTime) > TIMELIMIT then result := true; 
end;
というのを見つけたのですがLInput.cbSizeの.cbSizeとはどういう役割をしているのでしょうか?


jam  2004-09-10 07:59:49  No: 10883

個人的には、以下のようにクリアしてから設定することをお勧めします。

FillChar(LInput, sizeof(LInput), 0);
LInpu.cbSize := sizeof(LInput);

MSDN を見る限り cbSize の説明は "サイズを設定しなさい" としか書かれていないので、
どういう役割かまで認識する必要は基本的にはありません。

一般的には API の機能拡張が行われて情報量が増えた場合などに構造体の
サイズによってどのバージョンレベルで呼び出そうとしているかが API 側で
認識できるのようになり、API が設定する情報量を呼び出し元が用意した箱のサイズに
収まるようにすることができるようになると想像できます。

例えば、dwTime の下に dwDate などが増やされた場合などです。

こうしておけば、機能拡張が行われても古いプログラムを修正する必要がなく、
かつ新しいプログラムは機能拡張された追加情報を享受することができます。

Win32 API ではこの手法が多用されています。


省略エネ  2004-09-11 03:05:33  No: 10884

つまり
procedure TForm1.Timer1Timer(Sender: TObject);
var LInput : tagLastInputInfo;
begin
  FillChar(LInput, sizeof(LInput), 0);
  LInput.cbSize := sizeof(LInput);
  GetLastInputInfo(LInput);
  if (GetTickCount - LInput.dwTime) > 600000 then {...};
end;
とすればいいんですね

FillChar(LInput, sizeof(LInput), 0);
は値を初期化するという意味でしょうか?


省エネ  2004-09-11 03:21:28  No: 10885

すみませんミスです(汗


jam  2004-09-11 03:54:10  No: 10886

> FillChar(LInput, sizeof(LInput), 0);
> は値を初期化するという意味でしょうか?

無くても問題はないのですが...

予約領域などがある場合、通常は 0 クリアを前提としている場合が多いこと、
デバッグのし易さ、設定漏れ時のゴミによる不定動作の回避など、
わずか1行でいくつかのリスクを回避することができます。

それだけのことです...


省エネ  2004-09-11 08:28:24  No: 10887

念には念を、という事ですね


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加