普通、スクリーンセーバーにパスワードを設定しておくと正しいパスワードを入れなければスクリーンセーバーを終了することができないようになります。しかし、VCのサンプルなどにあるようなスクリーンセーバーでは Ctrl + Alt + Del でスクリーンセーバーのプロセスを終了させることでスクリーンセーバーを終了させることができます。これではパスワードを設定する意味がありません。
要はスクリーンセーバー起動中に Ctrl + Alt + Del を無効にすればよいのですが、なかなか自前でやるのは難しそうです。しかし、Windwosに付属のスクリーンセーバー起動中には Ctrl + Alt + Del は無効になっていますのでWindowsの設定でそういうことができそうです。
調べて見ると日本語の方にはありませんでしたが、英語のヘルプには
SystemParametersInfo
の引数に SPI_SETSCREENSAVERRUNNING
の項目があります。この引数とともにスクリーンセーバー起動開始時に TRUE
を、終了時に
FALSE
を与えてやると、 Ctrl + Alt + Del
を押してもプログラムの強制終了ダイアログが出なくなりました。
- LRESULT ScreenSaver_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- BOOL bDummy; // 1999/9/1 修正
- switch (uMsg){
- case WM_NCCREATE:
- … // スクリーンセーバーの初期化処理
- ::SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &bDummy, FALSE); // 1999/9/1 修正
- return TRUE;
- case WM_NCDESTROY:
- … // スクリーンセーバーの終了処理
- ::SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, FALSE, &bDummy, FALSE); // 1999/9/1 修正
- break;
- … // その他スクリーンセーバーのメッセージ処理
- }
- return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
- }
ただし、ヘルプには「内部的に使用されているのでアプリケーションでは使用するべきではない」(訳:蛭子屋双六)と書かれてあるので本当は使ってはいけないものなのかもしれません。
(99/9/1追記)
SystemParametersInfo
の第3引数には BOOL
へのポインタを入れておかないとうまく動いてくれないようです。