スクリーンセーバーの引数のあれこれ

スクリーンセーバーが起動する時、Windowsから引数が付けられ起動します。
この引数は実行するとか設定画面を表示するとかを判断させる為のものです。
この引数の取得の仕方と使い方を説明します。

Windowsに付けられる引数の種類は以下の4通り。

・ "/s"      スクリーンセーバー実行
・ "/p" "????"  プレビュー表示
・ "/a" "????"  パスワード設定

・ "/c:????"   設定画面表示


????は適当な数値です。この数値については個々に説明します。

まずは引数の判定です。


// 引数が無いときは設定画面を表示する
if(__argc == 1)
{
    // 設定画面の表示
}
// 引数のチェック
else if(__argv[1][0] == '-' || __argv[1][0] == '/')
{
    // 小文字に直す
    char cOption = __argv[1][1];
    cOption += (cOption <= 'Z') * 32;

    // 引数ごとに振り分け
    switch(cOption)
    {
    case 's':
        {
            // スクリーンセーバー実行
            return TRUE;
        }
    case 'p':
        {
            // プレビュー表示
            return TRUE;
        }
    case 'a':
        {
            // パスワード設定
            break;
        }
    case 'c':
        {
            // 設定画面表示
            break;
        }
    }
}
return FALSE

引数はグローバル変数の__argvに入っているのでそれを使います。
まず始めにグローバル変数__argcで引数が有るか無いか判定し
引数が無い場合は設定画面を表示させます。(理由は後で説明します)

次に引数のチェックを行いますが引数は"/p"じゃなくて
"-P"と大文字やハイフンで付けられる事も有るのでそれに対応させます。
後は引数毎の処理を行う様に振り分けて終わりです。


さて、後は各引数毎の処理の仕方を説明します。
まずは"/s"の時の処理、スクリーンセーバーの実行方法ですが
これは普通にスクリーンセーバーを起動させれば良いでしょう。
一般的なスクリーンセーバーならば全画面のウィンドウを作成して
そこに絵を描いていくといった処理を行います。
特に必要な設定は何もありません。

次は"/p"の時の処理、プレビューの表示です。
この引数は画面のプロパティーでスクリーンセーバータブを選んだとき
プレビュー画面に画像を表示させる為に呼び出されます。
引数の2番目のオプションには"????"(????は適当な数値)が入っていますが
これはプレビューの表示される小さな画面のハンドルです。
これを使ってプレビュー画面にプレビューを表示させます。
ただしこれは文字列なので使うには数値に変換してやる必要があります。
次のようにして変換してやってください。
MFCを使うのならCWndオブジェクトの方が扱いやすいのでその変換方法も書いておきます。


// 2番目の引数をウィンドウハンドルに変換
HWND hParentWnd = (HWND)atol(__argv[2]);

// ウィンドウハンドルからCWndオブジェクトの取得
CWnd* pParent = CWnd::FromHandle(hParentWnd);

次は"/a"の時の処理、パスワード設定画面を表示させます。
この引数はパスワードの設定ボタンを押したときに呼び出されます。
これはWindows9x系のみでWindowsNT系では付いてくる事はありません。
WindowsNTでのパスワード処理はOSレベルで行っています。
この引数の2番目のオプションもウィンドウのハンドルです。
どこのウィンドウかと言うと画面のプロパティーのダイアログのハンドルです。
つまりこのハンドルを親ウィンドウとしてパスワード設定画面を呼び出せば
パスワード設定画面を画面のプロパティーの後ろに回り込まなくする事が出来ます。
パスワード設定画面の呼び出し方はパスワード処理の方法と一緒に
また別の項目で説明したいと思います。
因みにこれも文字列なので使うときには上記の方法でハンドルに変換してやってください。

そして"/c:????"の時の処理、設定画面の表示の説明です。
この引数は画面のプロパティー>スクリーンセーバーの"変更"ボタンを押すと呼び出されます。
前半の"/c"は他と同様にどの処理をさせるか教える為のスイッチです。
後半の"????"は実はこれも画面のプロパティーのダイアログのハンドルです。
なぜ他のスイッチの様に2番目の引数に入っていないのかは知りません。(^^;
ただ、これはWindows95には付いてこないで"/c"だけで呼び出されます。
これが付くようになったのはWindows98以降のOSだと思われます。
# もしかしたらWinsowsNT4.0も付いてこないかも知れない…。

ま、これも"/a"と同様、設定画面を後ろに回り込まなくする為の物です。
以下の様にして親ウィンドウとして指定して使ってください。
一応、":????"の付いてこないWindows95にも対応させています。


// 親ウィンドウの取得
CWnd *pParent = NULL;
if(__argv[1][2] == ':')
    pParent = CWnd::FromHandle((HWND)atol(__argv[1] + 3));

// 設定画面の表示
CxxxDlg dlg(pParent);
dlg.DoModal();

最後に、スクリーンセーバ実行ファイルを右クリックして設定を選ぶと
引数には何も付けられずスクリーンセーバーは起動します。
その為、引数が無いときは設定画面を表示するようにする必要があるのです。

< 戻る << HOME ©1999-2001 by Akky, All right reserved.