ここ数回の記事において、Windows 10 にアップグレードしたことを話題にしてきた訳ですけれども。
まぁ、ほとんどの面で、概ね満足しているのですが、中には細かい不満点というか、「ここ、もうちょっとなんとかならない?」という点が無い訳ではありません。
その中の、本当に細かいことと言いますか、単なる好みの問題のひとつに、「デスクトップモードでスタートメニューからスリープすると、復帰時にスタートメニューが表示されたままなのが、微妙に気持ち悪い」というものがあります。
うん、まぁ、聞いただけで「どうでもいいー」と仰け反られてしまいそうな内容ですね。
どうでも良いことは、さくっと対処してしまうに限ります。
最初は、私も軽く考えて、「コマンドラインからスリープするショートカットでも作ればいいっしょ」と思っていたのです。
ところが、デフォルトで用意されている SHUTDOWN コマンドのオプションには、シャットダウンや再起動、そして休止状態(Hibernate)はあるのですが、スリープ(スタンバイ)状態が用意されていません。
あぁ、うん、そういえば、そうだった気もする。
すっかり忘れてましたが、昔も同じように調べて、同じように微妙な気持に陥った記憶が、薄らぼんやりとないではありません。
まぁ、シャットダウンコマンドだしねぇ......
で、仕方なく軽く調べてみたところ、色々と手段は見つかるものの、記憶の片隅にあって採用しようと思っていた方法が、何故か見つかりません。
正直、私の探し方が悪かっただけだと思いますが、それなりに有名な筈なのに、お手軽に見つからないのもどうかしらと思いまして、いちおう記事として残しておくことにしました。
どなたかのお役に立ちましたら。
あ、そうそう、発端は Windows 10 ですが、7 でも 8/8.1 でも、なんだったら XP や 2000 でも使える方法ですので、どうぞご安心を。
読み込み中です。少々お待ち下さい
どんな現象か
まず、私が若干気に食わなかった現象をご紹介しておきます。
スタートメニューの「電源」から「スリープ」を選択すると、こんな感じでスリープから復帰した直後は、スタートメニューが開きっぱなしなのです。
うぅん、我が事ながら、すこぶるつきにどうでもいいですね。
でも、気になるんだから、仕方ないじゃないですか!
なんか、気持ち悪いんですよ!!
と、心の底からどうでもいい魂の叫びをお聞きいただいたところで、早速実用的な解法を探っていくことにしましょう。
スリープについての基礎知識
対象とするユーザーのレイヤーによって、そのものを表す文言を Microsoft が使い分けているので、非常にややこしいことになっているのですが、一般的なユーザーがスリープと聞いて連想する機能は、より技術的な文書では「スタンバイ」と表記されることが多いです。
おおまかに言うと、スリープ(スタンバイ)、休止状態(Hibernate)、ハイブリットスリープ(両者を合わせたもの)があるのですが、その中にもいくつか種類があったり、デスクトップとノート PC で微妙な挙動の差異があったりと、細かいことを言い出すとキリがないので、詳しくは本家の説明等をご覧ください。
(対象が Windows 7 となっていますが、10 でも基本的に同じです。これより良いヘルプが見つからなかった......)
この記事では、スタートメニューから「スリープ」を選択した場合と同じ状態をコマンドで実現することを目的とします。
さて、それでは、まずはネットで良く見かける方法を、いくつか見ていきましょう。
余談:
上図の「電源」メニューに「休止状態」を表示したい場合は、「全てのコントロールパネル項目」>「電源オプション」>「電源ボタンの動作を選択する」を開き、「現在利用可能ではない設定を変更します」をクリックして、一番下の方にあるシャットダウン設定セクションの「休止状態」チェックをオンにします。
(シャットダウン設定に「休止状態」が表示されない場合は、機能がオフになっている可能性が高いです。ノート PC を使っている等の理由で有効にしたい場合は、後述の「powercfg /H on」を、必要に応じて管理者権限で実行する等してみましょう)
バッチファイルを使う方法
かなりアチコチで見かける、代表的(?)な方法から。
このページが、色々と情報がまとまっていて参考になると思います。
バッチファイルというか、powerprof.dll の SetSuspendState を引数にして rundll32.exe を実行する方法ですね。
要するに、以下のようなバッチファイルを作って、それに対するショートカットをデスクトップ等に作成して実行してあげると、条件を満たしていればスリープしてくれます。
powercfg /H OFF
rundll32.exe powrprof.dll,SetSuspendState
1 行目の「powercfg /H OFF」は、休止状態(Hibernate)が有効になっていると、スリープ(スタンバイ)ではなく休止状態に移行してしまうので、先んじて無効化している訳ですね。
ところが、これを実行するには、管理者権限が必要になります。
管理者モードでないと、このようにエラーになってしまいます。
つまり、休止状態を無効化してスリープさせるには、最低でも1回は管理者モードで「powercfg /H OFF」が実行されている必要がある訳ですが、普段あまりコマンドラインやバッチファイル等を利用しない方が、ネット上の情報を参考にバッチファイルを作成したはいいものの、実行しても画面は一瞬で消えてしまうので、そのままエラーに気づかずに、スリープのつもりで実際は休止状態になってしまっているような状況は、いかにもあり得そうです。
要するに、あんまり分かり易くありません。
また、問答無用で休止状態を無効化してしまうのも、環境によってはあまり良いことではないかも知れません。
例えばノート PC でバッテリ駆動をしている場合は、状況によってはスリープ(スタンバイ)よりも休止状態やハイブリットスリープの方が都合が良かったりもする訳でして、それらのデメリットを全て承知の上であればともかく、使いたい状況でも使えない状態にしてしまうのは、果たしてどうでしょうか。
スクリプトから呼び出す方法
続いてご紹介するのは、powerprof.dll の SetSuspendState をパラメータ指定でスクリプトから呼び出す方法です。
ちなみに、上の rundll32.exe を使うやり方で、末尾にパラメータを指定している書き方も見かけるのですが、rundll の動き方からして、おそらく効いてないんじゃないかと思います。
PowerShell の場合
Ruby の場合
スクリプトから直接 dll を呼び出せるのは、確かに大変便利でお手軽です。
また、上の引用元は技術者寄りに書かれているので問題無いのですが、一般的なユーザーにとっては、少々ハードルの高い方法かも知れません。
もっと簡単に、コマンド一発でスリープしてくれるような方法は無いのでしょうか?
それが、あるのです。
そう、技術者であればご存知の「Windows Sysinternals」というツール群を使えばね(語呂が悪い)。
さて、いよいよ本命です
Windows Sysinternals について詳しくは、本家の説明をご覧ください。
ごく簡単に言うならば、インストールが不要で exe 単体で動作する、やたらと多機能な Windows 用の便利ツール群です(とても沢山のツールが揃ってます)。
外部からプログラムをダウンロードして使うなんて、とんでもない! という環境もあるでしょうが、このツール群は作者の会社が Microsoft に買収されてからは、本家である Microsoft のサイト経由でダウンロードできるようになりましたので(アーカイブ本体は sysinternals.com に置かれています)、同種の他のツールとは安心感が違います。
(必ず Microsoft のサイトからダウンロードしましょう。たとえ名前が同じでも、どこか別のダウンロードサイトから落としてはいけません)
ということで、本記事の主題であるスリープを実現するコマンドが含まれている PsTools というコマンドラインツール群を、まずはダウンロードしてみましょう。
右上の「ダウンロード」から「PsTools スイートのダウンロード」をクリックしてください。
説明は、こちらになります。
日本語だと分かり辛い表現になっていますが、「-d」オプションの説明文「コンピューターを中断します」が、英語だと「Suspend the computer」となり、つまり、これがスリープ(スタンバイ)を指しています。
また違う呼び方が出てきちゃいましたね。
そういえば、一昔前はサスペンドの方が通りが良かったかも知れないです。
うーん、ややこしい(笑)
デスクトップにショートカットを作ろう
それでは、実際にデスクトップにスリープ(スタンバイ)用のショートカットを作ってみましょう。
(PsTools はコンソールアプリケーションですので、コマンドラインから使う場合は普通に実行してください)
まずは、ダウンロードした「PSTools.zip」を展開します。
最近の Windows は、デフォルトで zip ファイルをフォルダ風に開いてしまうので、却って説明が面倒臭いですね。
えぇと、「PSTools.zip」をダブルクリックすると、以下のように展開された風に表示されますが、実際はまだ zip の中身は展開されていませんので、このままでは使えません。
そこで、「圧縮フォルダーツール」の「展開」から、「すべて展開」をクリックして、zip ファイルを解凍します。
専用の解凍ツールをお使いの場合は、そちらで展開してください。
展開先はどこでも構いませんが、ここでは「C:\Users\ユーザー名\プログラム\コマンド」に展開したと仮定します。
ちなみに、デスクトップに直接展開すると、後で邪魔になった時に移動や削除が難しくなるので、避けた方が賢明だと思います。
続いて、エクスプローラーで「C:\Users\ユーザー名\プログラム\コマンド」フォルダに移動し、一覧から「psshutdown.exe」を選択して、「CTRL+C」キーや右クリックメニューでコピーしてください。
コピーしたら、今度はデスクトップの何も無い部分で右クリックをして、メニューから「ショートカットの貼り付け」を選択します。
すると、以下のように「psshutdown.exe - ショートカット」がデスクトップに作成されるので、右クリックから「プロパティ」を選択します。
「全般」タブで、名前を例えば「スリープ」に変更し、「ショートカット」タブのリンク先で、パスに続けて「-d -t 0」というオプションを追加します。
また、実行時の大きさは「最小化」、アイコンは「アイコンの変更...」ボタンを押して、適当にどこかから持ってきましょう。
アイコンといえば、以前は「%SystemRoot%\system32\shell32.dll」が定番だったのですが、最近は「%SystemRoot%\system32\imageres.dll」の方にそれっぽいアイコンが多く含まれています。
ちなみに、上の「スリープのプロパティ」画面のアイコンは、私が適当に作ったものなので、dll には含まれていません。
大した出来ではありませんが、いちおう置いておきますので、ご自由にお使いください。
さて、それでは
さて、これにて準備は全て整いました。
それでは、お好きなタイミングで、デスクトップのスリープアイコンをダブルクリックしてみてください。
見事、スリープ(スタンバイ)状態に移行しましたよね?
そして、復帰した時も、ちゃんとスタートメニューが表示されていません。
やりました! 目標達成です!
注意点
PsTools 自体はコンソールアプリケーションですが、初回起動時に 1 度だけ GUI で、以下のような「License Agreement」が表示されます。
同意する場合は「Agree」ボタンを押してください。
タマに、このウィンドウが裏回りしてしまい、一瞬ハングしたと見紛う状態になることがありますが、その場合は慌てずに「ALT+TAB」キー等で表示を切り替えてください。
おわりに
普通のショートカットですので、右クリックメニューから「タスクバーにピン留めする」を選択すれば、タスクバーに追加することも可能です。
が、注意しないと操作ミスによるスリープへの移行が頻発すると思われますので、ピン留めの際はお気を付けて。
ところで、もしあなたが Windows を日常的に利用している技術者で、まだ Windows Sysinternals のツール群を使ったことがなければ、とりあえず「Process Explorer」「Process Monitor」「Autoruns」辺りは触ってみても良いかも知れません。
この上なくお手軽で、とても便利ですから。
基本的に全てのツールが小さな exe ファイル単体さえあれば動くので、いわゆるインストール作業を必要せず、試すのも簡単です。
個人的なことを言えば、「Process Explorer」は日常的に使っています。
最近の Windows は、タスクマネージャーやリソースモニターの出来が良いので、かなりお役御免な雰囲気になってはきましたが、このお手軽さと一覧性はやはり捨てがたいです。
デフォルト状態だと、タスクマネージャーと大して変わらないので、必ずメニューの「View」→「Select Columns...」から必要な情報を選択しましょう。
プロセス毎の履歴をグラフで確認できるのが、とにかく便利。
全ての情報を表示するには管理者権限が必要なので、「File」メニューから「Show Details for All Processes」を選択しましょう。
大昔からあるツールなので、今日日 Sysinternals でもないだろう、という向きもあるかと思いますが、いざという時は、やっぱり便利だと思います。