スクリーンセーバー起動中に Ctrl + Alt + Del を無効にする

普通、スクリーンセーバーにパスワードを設定しておくと正しいパスワードを入れなければスクリーンセーバーを終了することができないようになります。しかし、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 へのポインタを入れておかないとうまく動いてくれないようです。


戻る