Tips

スクリーンセーバーの監視と利用

日付2008/01/16
ID08-002
バージョン2004
プラットフォームWin / Mac

この記事は、最新ではないバージョンに関連した方法について解説しています。

最新のバージョンでは推奨されていないか、または他の方法で簡単に実現できる可能性があります。

4Dのデータベースを長い間使わないままに起動しておくことは、セキュリティ的に問題があると考えるエンドユーザは多いと思います。そのようなとき、スクリーンセーバーと組み合わせてセキュリティを高めることができます。単にスクリーンセーバーの機能を使うだけでなく、4Dがスクリーンセーバーの動作を感知して、改めてデータベースにログインさせるようなメソッドを起動したり、終了処理を行うメソッドを作成することも可能です。

Windowsの場合

Windowsではスクリーンセーバーは拡張子が「scr」のファイルが起動したかを監視することになります。Windowsのプロセスの監視は、WMI(Windows Management Instrumentation)のWin32_Processクラスを使うことになり、4Dで直接行うことはできません。しかしVBS等でWMI監視のプログラム/スクリプトを作成することは、そんなに困難ではありませんし、VBS等のプログラムを4Dから呼び出して結果を受け取ることは簡単です。

下準備としてVBSのスクリプトファイルを用意します。メモ帳等で作成してファイルに保存する時の拡張子を「vbs」にします。vbsファイルには次のように記述します。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery ("SELECT * FROM Win32_Process WHERE Name LIKE '%.scr'")
If colProcesses.Count = 0 Then
    Wscript.Echo "No Screensaver Event"
Else
    For Each objProcess in colProcesses
        Wscript.Echo objProcess.CommandLine
    Next
End If

このスクリプトは、Win32_ProcessクラスのNameプロパティに「.scr」で終わるものをSQL文を使ってリスト化し、リストが空のときには「No Screensaver Event」を返すように作られています。このスクリプトは、Microsoft TechNetの下記のページを参考にして作成しました。

Microsoft TechNet:
スクリーンセーバーの開始時刻と終了時刻を記録する方法はありますか

作成したVBSを呼び出すには、LAUNCH EXTERNAL PROCESSを使います。後述のメソッド例では5秒間隔でVBSをcscriptコマンドで起動し、その結果をテキスト変数「t_output」で受け取ります。受け取った結果には余計な情報も混じっていますので、t_output変数にVBSでプログラムした「No Screensaver Event」が入っているかを調べて、スクリーンセーバーが動作しているかを判断しています。

C_TEXT($t_FilepathVbs;$t_input;$t_output)
C_BOOLEAN(<>b_stop)
$t_FilepathVbs:=C:\\Users\\...\\check.vbs"  `実際のVBSファイルのパス
<>b_stop:=False  `ループを終了できるようにインタープロセス変数を使う
Repeat 
	DELAY PROCESS(Current process;300)  `5秒
	SET ENVIRONMENT VARIABLE("_4D_OPTION_HIDE_CONSOLE";"true")
	LAUNCH EXTERNAL PROCESS("cscript "+$t_FilepathVbs;$t_input;$t_output)
	If ($t_output#"@No Screensaver Event@")
		ALERT("スクリーンセーバーが動作しました"+Char(CR ASCII code)+String(Current time))
	End if 
Until (<>b_stop)

この監視プログラムの例では単にアラートを表示するだけですが、ALERTの代わりにNew processなどを使って任意のメソッドを呼ぶように作成すれば、スクリーンセーバーが起動したのを受けて4Dで処理を行うことができます。この監視プロセスを終了させるためには、「<>b_stop:=True」と記述したメソッドを実行してください。

なおDELAY PROCESSを使っていますので、必ず新規プロセスで監視メソッドを動作させてください。

MacOSの場合

MacOSでは設定された無反応時間を経過するとScreenSaverEngine.appが起動し、画面上にスクリーンセーバーを表示します。つまり動作プロセスのリストに「ScreenSaverEngine.app」があるかを監視すれば、スクリーンセーバーが動作しているかが判ります。動作中のプロセスのリストはOSのpsコマンドにauxオプションを付与して得ることができます。

MacOS標準のコマンドを呼出す方法は、以前Tips「4Dコマンドで扱えない画像ファイルを扱う方法(MacOS X)」で紹介させていただいた方法を応用します。sipsコマンドを使う代わりにpsコマンドを使うだけです。Windowsの時と同じ結果を得るための具体的なメソッドは次のようになります。

C_TEXT($t_input;$t_output)
C_BOOLEAN(<>b_stop)
<>b_stop:=False  `ループを終了できるようにインタープロセス変数を使う
Repeat 
	DELAY PROCESS(Current process;300)  `5秒
	LAUNCH EXTERNAL PROCESS("ps aux";$t_input;$t_output)  `psコマンドを呼び出す
	If ($t_output="@ScreenSaverEngine.app@")
		ALERT("スクリーンセーバーが動作しました"+Char(CR ASCII code )+String(Current time))
	End if 
Until (<>b_stop)

注意点や改造のポイントは、前述のWindowsの時と同じです。

まとめ

一定時間何もユーザインターフェースが使われなかったかをチェックするのは、4Dのメソッドだけで管理するのは苦労が伴いますが、スクリーンセーバーを利用することで簡単に行えます。OSの設定をするときに注意しなければならないのは、スクリーンセーバーではなく、スリープ(省電力)の設定です。もしスリープしてしまうと、スクリーンセーバーはもちろん4Dも停止してしまうので、プログラムで検出することは不可能になります。スリープの設定には十分注意してください。また、ここで紹介した方法は、OS純正のスクリーンセーバーについて監視する方法ですので、サードパーティ製品などの利用時には働かないかもしれません。