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