UWSCでユーザーの最終入力からの経過時間を取得する
あけましておめでとうございます。
画面見ながら思案していると、スクリーンセーバーがうざい。
解除するようなスクリプトだと、本当に見てない時に嫌。
ということで、あとどれくらいでスクリーンセーバーが起動するか教えてくれるスクリプト用の補助モジュールを作成してみました。
最終入力からの経過時間を教えてくれるので、起動時間を算出してください。
ついでに、スクリーンセーバー中かロック中かを判定する関数もつけました。
スクリプト
2014/02/26 スクリーンセーバーの設定時間を取得できるように修正。
それに伴い、サンプルスクリプトを、2分を切るとBALLOONで残り時間を10秒単位で表示。
1分を切ると、1秒単位で表示に変更しました。
LastUserInput.uws
OPTION EXPLICIT, OPTFINALLY IFB GET_UWSC_NAME = "LastUserInput.uws" THEN DIM msg, premsg, s, tt, timeout = LUI.GetScreenSaverTimeout() CONST DELTA = 200 CONST THRESHOLD = 60000 WHILE TRUE IFB LUI.IsScreenSaver() THEN msg = "スクリーンセーバー中" s = 1 ELSEIF LUI.IsLocked() THEN msg = "ロック中" s = 10 ELSE tt = LUI.GetTick() + timeout - LUI.GetTickCount() IFB tt < DELTA THEN s = DELTA / 1000 msg = "スクリーンセーバー!" ELSEIF tt < THRESHOLD + DELTA THEN s = ((tt - DELTA) MOD 1000) / 1000 msg = "残り " + INT(tt / 1000) + " 秒!" ELSEIF tt < THRESHOLD * 2 + DELTA THEN s = ((tt - DELTA) MOD 10000) / 1000 msg = "残り " + INT(tt / THRESHOLD) + " 分 " + INT((tt MOD THRESHOLD) / 1000) + " 秒" ELSE s = (tt - THRESHOLD * 2 - DELTA) / 1000 msg = "" ENDIF ENDIF IFB msg <> premsg THEN IFB s < 1 THEN BALLOON(msg, 0, 0, 0, , , , , 60) ELSE BALLOON(msg, 0, 0, 0, 10, , , , 120) ENDIF premsg = msg ENDIF SLEEP(s) WEND ENDIF MODULE LUI DEF_DLL GetTickCount(): DWORD: kernel32 DEF_DLL GetLastInputInfo({DWORD, DWORD}): BOOL: user32 FUNCTION GetTick() IF !GetLastInputInfo(8, RESULT) THEN RESULT = 0 FEND FUNCTION Get() RESULT = GetTick() RESULT = GetTickCount() - RESULT FEND // スクリーンセーバー中 DEF_DLL SystemParametersInfoW(DWORD, DWORD, var DWORD, DWORD): BOOL: user32 CONST SPI_GETSCREENSAVERRUNNING = 114 CONST SPI_GETSCREENSAVETIMEOUT = 14 FUNCTION IsScreenSaver() IF !SystemParametersInfoW(SPI_GETSCREENSAVERRUNNING, 0, RESULT, 0) THEN RESULT = NULL FEND FUNCTION GetScreenSaverTimeout() RESULT = -1 IF SystemParametersInfoW(SPI_GETSCREENSAVETIMEOUT, 0, RESULT, 0) THEN RESULT = RESULT * 1000 FEND // ロックか誰もログオンしてない場合 DEF_DLL OpenInputDesktop(DWORD, BOOL, DWORD): DWORD: user32 DEF_DLL CloseDesktop(DWORD): BOOL: user32 FUNCTION IsLocked() DIM hDsk = OpenInputDesktop(0, FALSE, 1) RESULT = (hDsk = 0) IF !RESULT THEN CloseDesktop(hDsk) FEND ENDMODULE