スクリーンセーバーみたいな事をするタスクトレイ常駐アプリを作ってみたい
のですがPCが操作されていない事をどのように判断すると良いのでしょう?
MediaPlayerなどで映画を見てるなどは操作されてない扱いでいいです。
2000 以降であれば GetLastInputInfo API を使う。
95系は知りませぬ。
偶然、
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とはどういう役割をしているのでしょうか?
個人的には、以下のようにクリアしてから設定することをお勧めします。
FillChar(LInput, sizeof(LInput), 0);
LInpu.cbSize := sizeof(LInput);
MSDN を見る限り cbSize の説明は "サイズを設定しなさい" としか書かれていないので、
どういう役割かまで認識する必要は基本的にはありません。
一般的には API の機能拡張が行われて情報量が増えた場合などに構造体の
サイズによってどのバージョンレベルで呼び出そうとしているかが API 側で
認識できるのようになり、API が設定する情報量を呼び出し元が用意した箱のサイズに
収まるようにすることができるようになると想像できます。
例えば、dwTime の下に dwDate などが増やされた場合などです。
こうしておけば、機能拡張が行われても古いプログラムを修正する必要がなく、
かつ新しいプログラムは機能拡張された追加情報を享受することができます。
Win32 API ではこの手法が多用されています。
つまり
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);
は値を初期化するという意味でしょうか?
すみませんミスです(汗
> FillChar(LInput, sizeof(LInput), 0);
> は値を初期化するという意味でしょうか?
無くても問題はないのですが...
予約領域などがある場合、通常は 0 クリアを前提としている場合が多いこと、
デバッグのし易さ、設定漏れ時のゴミによる不定動作の回避など、
わずか1行でいくつかのリスクを回避することができます。
それだけのことです...
念には念を、という事ですね
ツイート | ![]() |