Windows10で日中にLightテーマを使って夜間にDarkテーマを使いたい

# 本稿は四角い車輪の再発明でしたッ！
既に先行するアプリケーションが存在していました。書き上げた段で知ったよ。

GitHub - Armin2208/Windows-Auto-Night-Mode: Automatically switches between the dark and light theme of Windows 10
https://github.com/Armin2208/Windows-Auto-Night-Mode

## 参考とした文献
Windows 10 Auto-Night-Mode のダウンロードと使い方 - ｋ本的に無料ソフト・フリーソフト
https://www.gigafree.net/system/theme/Windows-10-Auto-Night-Mode.html

# 三行で概要
 - Mac を弄っていて、日中と夜間の外観モード自動切り替え機能が目に優しい。
 - その優しさが Windows 10 にも欲しくなり、適当にスクリプトを書いてみた。
 - [天球の回転について](https://ja.wikipedia.org/wiki/%E5%A4%A9%E7%90%83%E3%81%AE%E5%9B%9E%E8%BB%A2%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)、それから[天体の回転について](https://www.amazon.co.jp/dp/4150310092)、思いを馳せるきっかけとなった。
 - おのれ[ジオイド](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%AA%E3%82%A4%E3%83%89)ォォォォォ! 

![スクリーンショット 2019-10-20 16.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/1f9bc87e-0b7f-8b58-26b3-e0dae4faf9a6.png)

![スクリーンショット 2019-10-20 17.19.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/77aa2e33-dee9-6da9-f775-dc5d8549f67d.png)

# やり方
 - sunwait.exe をダウンロードして適当に配置する。
 - バッチファイルとランチャーを作成する。
 - ランチャーをスタートアップに登録する。

![2019-10-20 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/97e87aec-8683-4d4c-36c6-c62d841f1c8b.png)

![2019-10-20 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/fff4ea7e-7a29-e373-bb7a-9eda6a29a646.png)

# Sunwait の入手
Windows 及び Linux で使える日時計でタイマーなコマンドラインアプリ。ビルドが通れば（あるいは Wine を使えば）Mac でも FreeBSD でも行けると思う。

Sunwait、つかおう。

## 配布元

<details><summary>配付元</summary><div>

Sunwait download | SourceForge.net
https://sourceforge.net/projects/sunwait4windows/

Sunwait / Discussion / General Discussion: Unfork / Move to GitHub
https://sourceforge.net/p/sunwait4windows/discussion/general/thread/89fc1f5c8c/

GitHub - risacher/sunwait: Sunwait calculates sunrise or sunset times with civil, nautical, astronomical and custom twilights, for use with Windows Task Scheduler or 'cron' on Linux.
https://github.com/risacher/sunwait

GitHub - risacher/sunwait at solarnoon（このブランチに Bugfix 版バイナリが存在）
https://github.com/risacher/sunwait/tree/solarnoon

※ solar noon については以下のリンク先を参照下さい（日本においては現在地点と[東経135度線](https://ja.wikipedia.org/wiki/東経135度線)との経度の差によっても南中時刻は変化します）。

<details><summary>solar noon / 南中時刻に関するリンク</summary><div>

暦Wiki/日の出入りと南中 - 国立天文台暦計算室
https://eco.mtk.nao.ac.jp/koyomi/wiki/C6FCA4CEBDD0C6FEA4EAA4C8C6EEC3E6.html

暦Wiki/日の出入りと南中/南中時刻は変化する - 国立天文台暦計算室
https://eco.mtk.nao.ac.jp/koyomi/wiki/C6FCA4CEBDD0C6FEA4EAA4C8C6EEC3E62FC6EEC3E6BBFEB9EFA4CFCAD1B2BDA4B9A4EB.html

Sunrise and sunset times in Tokyo - www.timeanddate.com
https://www.timeanddate.com/sun/japan/tokyo

日の出　日の入りの時刻を求める計算式 -日の出　日の入りの時刻を求め- 宇宙科学・天文学・天気 | 教えて!goo
https://oshiete.goo.ne.jp/qa/6106290.html

日出没にまつわるはなし｜天文・暦情報｜海上保安庁海洋情報部
https://www1.kaiho.mlit.go.jp/KOHO/faq/astro/sunrise.html

</div></details>

</div></details>

## sunwait /?

<details><summary><b>sunwait /?</b></summary><div>

```
sunwait /?
Error: Unknown command-line argument: /?
Calculate sunrise and sunset times for the current or targetted day.
The times can be adjusted either for twilight or fixed durations.

The program can either: wait for sunrise or sunset   (function: wait),
  or return the time (GMT or local) the event occurs (function: list),
  or report the day length and twilight timings      (function: report),
  or simply report if it is DAY or NIGHT             (function: poll).

You should specify the latitude and longitude of your target location.


Usage: sunwait [major options] [minor options] [twilight type] [rise|set] [offset] [latitude] [longitude]

Major options, either:
    poll          Returns immediately indicating DAY or NIGHT. See 'program exit codes'. Default.
    wait          Sleep until specified event occurs. Else exit immediate.
    list [X]      Report twilight times for next 'X' days (inclusive). Default: 1.
    report        Generate a report about the days sunrise and sunset timings.

Minor options, any of:
    [no]debug     Print extra info and returns in one minute. Default: nodebug.
    [no]version   Print the version number. Default: noversion.
    [no]help      Print this help. Default: nohelp.
    [no]gmt       Print times in GMT or local-time.  Default: nogmt.

Twilight types, either:
    daylight      Top of sun just below the horizon. Default.
    civil         Civil Twilight.         -6 degrees below horizon.
    nautical      Nautical twilight.     -12 degrees below horizon.
    astronomical  Astronomical twilight. -18 degrees below horizon.
    angle [X.XX]  User-specified twilight-angle (degrees). Default: 0.

Sunrise/sunset. Only useful with major-options: 'wait' and 'list'. Any of: (default: both)
    rise          Wait for the sun to rise past specified twilight & offset.
    set           Wait for the sun to  set past specified twilight & offset.

Offset:
    offset [MM|HH:MM] Time interval (+ve towards noon) to adjust twilight calculation.

Target date. Only useful with major-options: 'report' or 'list'. Default: today
    d [DD]        Set the target Day-of-Month to calculate for. 1 to 31.
    m [MM]        Set the target Month to calculate for. 1 to 12.
    y [YYYY]      Set the target Year to calculate for. 2000 to 2099.

latitude/longitude coordinates: floating-point degrees, with [NESW] appended. Default: Bingham, England.

Exit (return) codes:
    0           OK: exit from 'wait' or 'list' only.
    1           Error.
    2           Exit from 'poll': it is DAY or twilight.
    3           Exit from 'poll': it is NIGHT (after twilight).

Example 1: sunwait wait rise offset -1:15:10 51.477932N 0.000000E
Wait until 1 hour 15 minutes 10 secs before the sun rises in Greenwich, London.

Example 2: sunwait list 7 civil 55.752163N 37.617524E
List civil sunrise and sunset times for today and next 6 days. Moscow.

Example 3: sunwait poll exit angle 10 54.897786N -1.517536E
Indicate by program exit-code if is Day or Night using a custom twilight angle of 10 degrees above horizon. Washington, UK.

Example 4: sunwait list 7 gmt sunrise angle 3
List next 7 days sunrise times, custom +3 degree twilight angle, default location.
Uses GMT; as any change in daylight saving over the specified period is not considered.

Note that program uses C library functions to determine time and localtime.
Error for timings are estimated at: +/- 4 minutes.
```

</div></details>

# バッチファイル作成例

条件分岐でテーマの変更と Sunwait によるスリープを行う[バッチファイル](https://wa3.i-3-i.info/word11216.html)。

とりあえず[経度・緯度](https://ja.wikipedia.org/wiki/%E7%B5%8C%E7%B7%AF%E5%BA%A6)の初期値は “[北緯35度29分29秒 東経139度50分5秒](https://ja.wikipedia.org/wiki/%E5%B7%9D%E5%B4%8E%E4%BA%BA%E5%B7%A5%E5%B3%B6)” 「[風の塔](https://www.kajima.co.jp/news/digest/jan_1998/tokushu/toku3.htm)」。

※ 下記サンプルコードは sunwait.exe を ```C:\sunwait\``` 以下に配置した場合のものです。

```:themechanger.bat
@echo off
set COMMAND_SUNWAIT=C:\sunwait\sunwait.exe
set LATITUDE_SUNWAIT=35.491389N
set LONGITUDE_SUNWAIT=139.834722E
:loop
for /f "usebackq" %%i in (`%COMMAND_SUNWAIT% poll %LATITUDE_SUNWAIT% %LONGITUDE_SUNWAIT%`) do set day_or_night=%%i
if %day_or_night%==DAY (reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize /v AppsUseLightTheme /t REG_DWORD /d 1 /f) else (reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize /v AppsUseLightTheme /t REG_DWORD /d 0 /f)
if %day_or_night%==DAY (reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 1 /f) else (reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 0 /f)
if %day_or_night%==DAY (%COMMAND_SUNWAIT% wait %LATITUDE_SUNWAIT% %LONGITUDE_SUNWAIT% sunset) else (%COMMAND_SUNWAIT% wait %LATITUDE_SUNWAIT% %LONGITUDE_SUNWAIT% sunrise)
goto loop
```

goto━━━━(ﾟ∀ﾟ)━━━━!!

日の出日の入りで変化するのは[不定時法](https://www.amazon.co.jp/dp/4056058970)っぽいかも。

江戸の時刻制度“不定時法”：お江戸の科学
https://www.gakken.co.jp/kagakusouken/spread/oedo/03/kaisetsu1.html

USB の照度センサーをつないで、時間経過ではなく PC 周辺の光量に応じてテーマが選択されるようにするのもカーナビみたいで面白そう。

## 十進法表記の経度・緯度情報の検索
Web版TKY2JGD - 国土地理院
https://vldb.gsi.go.jp/sokuchi/surveycalc/tky2jgd/main.html

緯度と経度の確認、入力 - パソコン - マップ ヘルプ - Google マップ
https://support.google.com/maps/answer/18539

## 参考とした文献

<details><summary>参考とした文献</summary><div>

バッチファイルで「＠echo off」を使う - 知識ゼロからのwindowsバッチファイル超入門
https://jj-blues.com/cms/wantto-useechooff/

windowsで変数にファイルの中身や実行結果を格納する方法 | ハックノート
https://hacknote.jp/archives/12683/

Windows-バッチ,コマンド実行結果を変数に格納(取得)する - 德永龍郎のサイト
https://iwakurabit.com/training-pgm-windows-batch-storing-the-execution-result-of-the-command-variable/

無限ループする - コマンドプロンプトの予感
https://commandprompt.noyokan.com/command/infinite_loop.html

batch file cmd ファイルの %と %% の違いは何ですか? - 初心者入門サンプル
https://code-examples.net/ja/q/dd6654

Q75634: Percent Signs Stripped from Batch File Text | KnowledgeBase Archive
https://jeffpar.github.io/kbarchive/kb/075/Q75634/

拡張子「.bat」と「.cmd」の違い｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/diff190bat.html

上級ユーザー向けの Windows レジストリ情報
https://support.microsoft.com/ja-jp/help/256986/windows-registry-information-for-advanced-users

コマンドでレジストリの値を取得、設定する方法 - Windows - Project Group
https://www.projectgroup.info/tips/Windows/cmd_0024.html

Reg Add - DOS コマンド一覧 - Programming Field
https://www.pg-fl.jp/program/dos/doscmd/reg_add.htm

MS-DOS and Windows command line reg command - Computer Hope's Free Computer Help
https://www.computerhope.com/reg.htm

reg | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/reg

【レビュー】レジストリの差分を表示するシンプルなユーティリティ「RegistryChangesView」 - 窓の杜
https://forest.watch.impress.co.jp/docs/review/1071875.html
※ テーマや壁紙を入れ替えながら RegistryChangesView でチェックして関連のありそうなレジストリを割り出しました。

<details><summary><b>＠echo /?</b></summary><div>

```
@echo /?
メッセージを表示したり、コマンド エコーの ON と OFF を切り替えます。

  ECHO [ON | OFF]
  ECHO [メッセージ]

現在のエコー設定を表示するには、パラメーターを指定せずに ECHO と入力してください。
```

</div></details>

<details><summary><b>set /?</b></summary><div>

```
set /?
cmd.exe 環境変数を表示、設定、または削除します。

SET [変数名=[文字列]]

  変数名   環境変数名を指定します。
  文字列   変数に割り当てる文字列を指定します。

現在の環境変数を表示するには、パラメーターを指定せずに SET と入力してください。

コマンド拡張機能を有効にすると、SET は、次のように変更されます:

等号や値を指定せずに、変数名だけを指定して SET コマンドを実行すると、
SET コマンドに指定された名前にプレフィックスが一致するすべての変数の値が
表示されます。たとえば、

    SET P

と入力すると、文字 'P' で始まるすべての変数が表示されます。

変数名が現在の環境に見つからない場合は、SET コマンドは、ERRORLEVEL を
1 に設定します。

SET コマンドでは、変数の名前に等符号を使用することはできません。

SET コマンドには、2 つの新しいスイッチが追加されています:

    SET /A 式
    SET /P 変数=[プロンプト文字列]

/A スイッチは、等号の右側の文字列が、評価する数式であることを
指定します。式の評価はごく単純で、次の操作がサポートされます。
操作は、優先順位の高い順に示されています:

    ()                  - グループ化
    ! ~ -               - 単項演算子
    * / %              - 算術演算子
    + -                 - 算術演算子
    << >>               - 論理シフト
    &                    - ビット演算子 AND
    ^                   - ビット演算子排他的 OR
    |                   - ビット演算子 OR
    = *= /= %= += -=   - 代入
      &= ^= |= <<= >>=
    ,                   - 式の区切り記号

論理演算子またはモジュール演算子を使う場合は、式文字列を
引用符で囲む必要があります。式内の数値以外の文字列は環境変数文字列として
処理され、使用される前に数値に変換されます。
指定された環境変数名が現在の環境で定義されていない場合は、
値として 0 が使用されます。
これにより、いくつもの % 記号を入力して値を取得しないでも、
環境変数の値を算術演算に使うことができます。
コマンド スクリプト外でコマンド ラインから SET /A を実行すると、
式の最終的な値が表示されます。
割り当て演算子を使うには、割り当て演算子
の左側に環境変数名が必要です。
数値は 10 進数ですが、プレフィックスとして 0x
を付けると 16 進数、0 を付けると 8 進数になります。従って、0x12 は 18、
あるいは 022 と同じです。
8 進表記を使う場合は、注意してください。08 や
09 は、8 と 9 が有効な 8 進数ではないため、
有効な数値ではありません。

/P はユーザーによって入力された入力行を変数の値として設定できるようにします。
入力行を読み取る前に、指定されたプロンプト文字列を表示します。プロンプト文
字列は空でもかまいません。

環境変数の置換は、次のように拡張されます:

    %PATH:文字列 1 = 文字列 2%

は、PATH 環境変数を展開し、その結果に含まれるすべての "文字列 1" を
"文字列 2" に置き換えます。
"文字列 2" に空の文字列を指定すると、展開された出力からすべての "文字列 1"
を削除することができます。
"文字列 1"
をアスタリスクで始め、展開された出力の先頭から、文字列 1 の残りの部分
が最初に現れるまでのすべてを一致させることもできます。

また、展開の副文字列を指定することもできます。

    %PATH:~10,5%

は、PATH 環境変数を展開し、展開結果の 11 番目 (オフセット 10) の文字
から始まる 5 文字だけを使います。長さが指定されなかった場合は、変数の
値の残りの長さを既定値とします。オフセットまたは長さのどちらかが負の値
の場合、環境変数の値の長さに指定されたオフセットまたは長さをたしてその
数を使います。

    %PATH:~-10%

は、パス変数の最後の 10 文字が展開されます。

    %PATH:~0,-2%

は最後の 2 文字以外のすべてが展開されます。

最後に、遅延環境変数の展開が追加されました。このサポートは常に既定で
無効になっていますが、CMD.EXE の /V: のコマンド ライン スイッチを使
って有効または無効にできます。
CMD /? を参照してください。

遅延環境変数の展開は、実行時ではなく、テキスト行を読み取るときに展開
されるという現在の制限を避けるために役立ちます。
次の例は即時変数展開の問題を説明しています。

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after;
        if "%VAR%" == "after" @echo If you see this, it worked
    )

この例は、論理的には IF 文が別の IF 文の本体に含まれる複合文なので、
両方の IF 文の %VAR% が、最初の IF 文を読み取ったときに展開されます。
このため、メッセージは決して表示されません。
複合文の中の IF では "before" と "after" が比較され、
決して等しくはなりません。
同様に次の例も期待したようには動作しません。

    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

この例では、現在のディレクトリのファイルの一覧は作成されず、代わりに最後
に見つけられたファイルが LIST 変数に設定されます。
これは %LIST% が FOR 文が読み取られるとき、
一度だけ展開され、そのときは LIST 変数が空だからです。
つまり、実際に実行されている FOR ループは

    for %i in (*) do set LIST= %i

で、LIST に最後に見つけられたファイルを設定し続けているだけです。

遅延環境変数の展開では、実行時に環境変数を展開するために異なった文字
(感嘆符) を使うことができます。
遅延環境変数の展開が有効な場合、上記の
例は次のように書くと意図したように動作します。

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )

    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%

コマンド拡張機能が有効な場合、SET によって表示される変数の一覧には
現れないいくつかの動的な環境変数があります。
これらの変数の値は、変数の値が展開されるときに
動的に計算されます。
ユーザーがこれらの名前の変数を明示的に定義する場合、
その定義は下記の動的な定義を無効にします。

%CD%            - 現在のディレクトリ文字列に展開します。

%DATE%          - DATE コマンドと同じフォーマットで現在の日付に展開します。

%TIME%          - TIME コマンドと同じフォーマットで現在の時刻に展開します。

%RANDOM%        - 0 から 32767 の間の任意の 10 進数に展開します。

%ERRORLEVEL%    - 現在の ERRORLEVEL の値に展開します。

%CMDEXTVERSION% - 現在のコマンド プロセッサ拡張機能のバージョン番号に
                    展開します。

%CMDCMDLINE%    - コマンド プロセッサを起動したオリジナル コマンド ライン
                    に展開します。

%HIGHESTNUMANODENUMBER%
                  - このコンピューター上の最大の NUMA ノード番号に展開します。
```

</div></details>

<details><summary><b>for /?</b></summary><div>

```
for /?
指定されたコマンドをファイル セットの各ファイルに対して実行します。

FOR %変数 IN (セット) DO コマンド [コマンドパラメーター]

  %変数     単一文字の置き換え可能なパラメーターを指定します。
  (セット)  ファイル セットを指定します。ワイルドカードを使用できます。
  コマンド  各ファイルごとに実行するコマンドを指定します。
  コマンドパラメーター
            指定されたコマンドのパラメーターまたはスイッチを指定します。

バッチ プログラムで FOR コマンドを使用するときは、%変数の代わりに、
%%変数を使用してください。変数名では大文字と小文字が区別されるため、
%i と %I は異なります。

コマンド拡張機能を有効にすると、次の FOR コマンドの追加形式
がサポートされるようになります:

FOR /D %変数 IN (セット) DO コマンド [コマンド パラメーター]

    セットがワイルドカードを含む場合は、ファイル名ではなくディレクトリ名
    の一致を指定します。

FOR /R [[ドライブ:]パス] %変数 IN (セット) DO コマンド [コマンド パラメーター]

    [ドライブ:]パスから始めて、ツリーの各ディレクトリで FOR 文を実行し
    ます。/R の後にディレクトリが指定されていない場合は、現在の
    ディレクトリが使用されます。セットが単一のピリオド (.) である場合は、
    ディレクトリ ツリーの列挙だけを行います。

FOR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンド パラメーター]

    セットは、ステップの量ごとに変化する開始から終了までの数列です。
    たとえば、(1,1,5) は 1 2 3 4 5、(5,-1,1) は (5 4 3 2 1) という数列に
    なります。

FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
       [コマンド パラメーター]
FOR /F ["オプション"] %変数 IN ("文字列") DO コマンド [コマンド パラメーター]
FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメーター]

    または usebackq オプションの場合:

FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
       [コマンド パラメーター]
FOR /F ["オプション"] %変数 IN ('文字列') DO コマンド [コマンド パラメーター]
FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメーター]

    ファイル セットは、1 つ以上のファイル名です。各ファイルが開かれ、
    読み取られ、処理されてから、ファイル セットの次のファイルに進みます。
    処理では、ファイルの読み取り、個々のテキスト行への分割と、0 個以上の
    トークンへの解析が行われます。その後、見つかったトークン文字列を変数値に
    設定して for ループの本体が呼び出されます。既定では、/F は、各ファイルの
    各行から、空白で区切られた最初のトークンを取得して渡します。空白行は
    スキップされます。既定の解析動作を変更するには、省略可能な "オプション"
    パラメーターを指定します。これは、異なる解析オプションを指定する 1 つ以上の
    キーワードを含む、引用符で囲まれた文字列です。キーワードは、次のとおりです:

        eol=c           - 行末のコメント文字を指定します (1 文字)。
        skip=n          - ファイルの先頭でスキップする行数を指定します。
        delims=xxx      - 区切り文字のセットを指定します。
                          これは、既定の区切り文字であるスペースとタブを
                          置き換えます。
        tokens=x,y,m-n  - 各繰り返しに対して、各行から for 本体に渡す
                          トークンを指定します。これにより、追加の変数名が
                          割り当てられます。
                          m-n の形式は範囲で、m 番目から n 番目の
                          トークンを指定します。
                          tokens= 文字列の最後の文字がアスタリスクである場合は、
                          追加の変数が割り当てられ、最後のトークンが解析された
                          後、行に含まれている残りのテキストを受け取ります。
        usebackq        - 次の新しい表示形式を指定します。
                          逆引用符で囲まれた文字列がコマンドとして実行され、
                          一重引用符で囲まれた文字列がリテラル文字列コマンドに
                          なり、ファイル セットのファイル名を二重引用符で
                          囲めるようになります。

    例を参考にしてください:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    この例は、myfile.txt の各行を解析します。セミコロンで始まる行を無視し、
    各行の 2 番目と 3 番目のトークンを for 本体に渡します。
    トークンは、コンマまたはスペースで区切られています。
    for 本体の文が %i で 2 番目のトークンを、%j で 3 番目のトークンを取得し、
    %k で 3 番目以降のすべてのトークンを取得していることに
    注意してください。
    スペースを含むファイル名に対しては、二重引用符でファイル名を引用する
    必要があります。
    この方法で二重引用符を使うためには、usebackq オプションも
    使わなければなりません。
    使わなければ、二重引用符はリテラル文字列の定義として
    解釈され、解析されます。

    %i は for 文で明示的に宣言され、%j と %k は tokens= オプションで暗黙的に
    宣言されています。
    tokens= 行を使って 26 個までのトークンを指定できますが、
    文字 'z' または 'Z' よりも高い変数を宣言することはできません。FOR 変数名は
    単一の文字で、大文字と小文字を区別し、グローバルなものであり、一度に
    アクティブにできるのは合計 52 個までです。

    また、かっこで囲んだファイル セットを一重引用符で囲み、文字列にすることに
    より、即時の文字列に対する FOR /F 解析ロジックを使うこともできます。
    これは、ファイルからの単一入力行として処理されます。

    最後に、FOR /F コマンドを使って、コマンド出力を解析することができます。
    かっこの中のファイル セットを逆引用符で囲みます。この文字列は、コマンド
    ラインとして子 CMD.EXE に渡されます。出力はメモリにキャプチャされ、
    ファイルのように解析されます。
    例:

      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

    この例は、現在の環境の環境変数名を列挙します。

また、FOR 変数参照の置換も拡張されました。
次のオプション構文を使うことができます:

    %~I         - すべての引用句 (") を削除して、%I を展開します。
    %~fI        - %I を完全修飾パス名に展開します。
    %~dI        - %I をドライブ文字だけに展開します。
    %~pI        - %I をパス名だけに展開します。
    %~nI        - %I をファイル名だけに展開します。
    %~xI        - %I をファイル拡張子だけに展開します。
    %~sI        - 展開されたパスは短い名前だけを含みます。
    %~aI        - %I をファイルの属性に展開します。
    %~tI        - %I ファイルの日付/時刻に展開します。
    %~zI        - %I ファイルのサイズに展開します。
    %~$PATH:I   - PATH 環境変数に指定されているディレクトリを
                   検索し、最初に見つかった完全修飾名に %I を
                   展開します。
                   環境変数名が定義されていない場合、または検索
                   してもファイルが見つからなかった場合は、この
                   修飾子を指定すると空の文字列に展開されます。

修飾子を組み合わせて、複合結果を得ることもできます:

    %~dpI       - %I をドライブ文字とパスだけに展開します。
    %~nxI       - %I をファイル名と拡張子だけに展開します。
    %~fsI       - %I を完全なパスと短い名前だけに展開します。
    %~dp$PATH:I - PATH 環境変数に指定されているディレクトリを
                   検索して %I を探し、最初に見つかったファイル
                   のドライブ文字とパスだけに展開します。
    %~ftzaI     - %I を DIR コマンドの出力行のように展開します。

上の例の %I と PATH は、他の有効な値で置き換えることができます。
%~ 構文は、有効な FOR 変数名によって区切られます。%I のような大
文字の変数を使うと読み取りやすく、大文字と小文字を区別しない修飾子
との混乱を避けることができます。
```

</div></details>

<details><summary><b>if /?</b></summary><div>

```
if /?
バッチ プログラム中で条件処理を実行します。

IF [NOT] ERRORLEVEL 番号 コマンド
IF [NOT] 文字列1==文字列2 コマンド
IF [NOT] EXIST ファイル名 コマンド

  NOT               条件が偽の場合にだけ、Windows がコマンドを実行する
                    ことを指定します。

  ERRORLEVEL 番号   最後のプログラムの実行で指定された番号以上の終了コード
                    が返されたときに、条件が真になるように指定します。

  文字列1==文字列2  テキスト文字列が一致するときに条件が真になるように指定
                    します。

  EXIST ファイル名  指定したファイル名が存在するときに条件が真になるように
                    指定します。

  コマンド          条件が真のときに実行するコマンドを指定します。コマンドに
                    続けて、ELSE キーワードの後、指定した条件が偽の場合に
                    実行される ELSE コマンドを指定することができます。

ELSE 節は、IF の後のコマンドと同じ行に置きます。
例:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

del コマンドは、改行で終了しなければならないため、次の例は、正しく動作し
ません:

    IF EXIST filename. del filename. ELSE echo filename. missing

ELSE コマンドは、IF コマンドの終わりと同じ行で始まらなければならないため、
次の例は正しく動作しません:

    IF EXIST filename. del filename.
    ELSE echo filename. missing

次の例のように、すべてのコマンドを 1 行にすれば正しく動作します:

    IF EXIST filename. (del filename.) ELSE echo filename. missing

コマンド拡張機能を有効にすると、IF は次のように変更されます:

    IF [/I] 文字列 1 比較演算子 文字列 2 コマンド
    IF CMDEXTVERSION 番号 コマンド
    IF DEFINED 変数 コマンド

比較演算子は、次のいずれかです:

    EQU - 等しい
    NEQ - 等しくない
    LSS - より小さい
    LEQ - 以下
    GTR - より大きい
    GEQ - 以上

/I スイッチを指定すると、文字列は、大文字と小文字を区別せずに比較され
ます。
/I スイッチは、IF の文字列 1 == 文字列 2 形式で使うこともできます。
この比較は汎用であり、文字列 1 と文字列 2 が両方とも数字だけを含む場合は、
文字列が数値に変換され、数値の比較が行われます。

CMDEXTVERSION 条件は ERRORLEVEL と同様に動作しますが、コマンド拡張機能
に関連付けられている内部バージョン番号との比較を行います。最初の
バージョンは 1 です。
コマンド拡張機能に重要な拡張が追加された場合は、値が 1 大きくなります。
コマンド拡張機能が無効である場合は、CMDEXTVERSION 条件は常に偽です。

DEFINED 条件は EXIST と同様に動作しますが、環境変数名を受け取って、環境
変数が定義されている場合は真を返します。

%ERRORLEVEL% は、ERRORLEVEL の現在の値の文字列表記に展開されます。
ただし、ERRORLEVEL という名前の環境変数が既に定義されている場合は、その
環境変数の値が取得されます。
プログラム実行後、次の例が ERRORLEVEL の使い方を説明しています:

    goto answer%ERRORLEVEL%
    :answer0
    echo Program had return code 0
    :answer1
    echo Program had return code 1

また、上の数値比較を使うこともできます:

    IF %ERRORLEVEL% LEQ 1 goto okay

%CMDCMDLINE% は、CMD.EXE が処理する前の、CMD.EXE に渡されたオリジナル
のコマンド ラインに展開されます。
ただし、CMDCMDLINE という名前の環境変数が既に定義されている場合は、
その環境変数の値が取得されます。

%CMDEXTVERSION% は、CMDEXTVERSION の現在の値の文字列表記に
展開されます。
ただし、CMDEXTVERSION という名前の環境変数が既に定義されている場合は、
その環境変数の値が取得されます。
```

</div></details>

<details><summary><b>goto /?</b></summary><div>

```
goto /?
バッチ プログラム内の、ラベルで指定されている行へ制御を移動します。

GOTO ラベル

  ラベル   バッチ プログラムでラベルとして使用するテキスト文字列を指定します。

ラベルの先頭には : (コロン) を指定し、ラベルだけを単独で 1 行に入力してくだ
さい。

コマンド拡張機能を有効にすると、GOTO は次のように変更されます:

GOTO コマンドにターゲット ラベルとして :EOF を指定し、現在のバッチ
スクリプト ファイルの最後に制御を移すことができるようになります。
ラベルを定義しないでバッチ スクリプト ファイルを終了するには、この方法
が簡単です。この機能を実用化する CALL コマンドの拡張機能の説明について
は、「CALL /?」と入力してください。
```

</div></details>

<details><summary><b>reg /?</b></summary><div>

```
reg /?

REG 操作 [パラメーターの一覧]

  操作  [ QUERY   | ADD    | DELETE  | COPY    |
          SAVE    | LOAD   | UNLOAD  | RESTORE |
          COMPARE | EXPORT | IMPORT  | FLAGS ]

リターン コード: (例外: REG COMPARE)

  0 - 成功
  1 - 失敗

特定の操作のヘルプについては、次のように入力してください:

  REG 操作 /?

例:

  REG QUERY /?
  REG ADD /?
  REG DELETE /?
  REG COPY /?
  REG SAVE /?
  REG RESTORE /?
  REG LOAD /?
  REG UNLOAD /?
  REG COMPARE /?
  REG EXPORT /?
  REG IMPORT /?
  REG FLAGS /?
```

</div></details>

</div></details>

# ランチャー作成例
DOS 窓を開かない為の [VBScript](https://wa3.i-3-i.info/word14238.html) 。

```:launcher.vbs
Set Launcher = CreateObject("WScript.Shell")
Launcher.Run "cmd /c C:\sunwait\themechanger.bat", 0, False
```

※ 最終行の第二引数は 0（ないし vbHide）、第三引数は第一引数に与えた themechanger.bat の終了待ちをさせないので False としました。[参考文献](https://win.just4fun.biz/?WSH/%E5%A4%96%E9%83%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%83%BBRun%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)。

※ 上記サンプルコードは sunwait.exe と themechanger.bat を ```C:\sunwait\``` 以下に配置した場合のものです。

## 参考とした文献

<details><summary>参考とした文献</summary><div>

Visual Basic のプログラミング ガイド | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/

Visual Basic の名前付け規則 | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/program-structure/naming-conventions

キーワード (Visual Basic) | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/keywords/

Set - VBScript - SS64.com
https://ss64.com/vb/set.html

CreateObject - VBScript - SS64.com
https://ss64.com/vb/createobject.html

[WSH/外部コマンドを実行する方法・Runメソッド - Windowsと暮らす](https://win.just4fun.biz/?WSH/%E5%A4%96%E9%83%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%83%BBRun%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)
※ WScript／Windows Script Host／WSH。コマンドは ```C:\Windows\System32\wscript.exe``` に存在します。

[Windows] バッチファイル（.bat）を非表示・最小化した状態で起動する
https://uguisu.skr.jp/Windows/bat_nowindow.html

バッチファイルを実行する時に黒いコマンドプロンプト画面を表示しない方法 | パソコンが便利で楽になるものを紹介しています
https://amaotolog.com/pc-benri/33

.Run - VBScript - SS64.com
https://ss64.com/vb/run.html

Shell 関数 (Visual Basic for Applications) | Microsoft Docs
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/shell-function

オブジェクト (object)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word1119.html

メソッド (method)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word1906.html

関数 (function)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word1905.html

<details><summary><b>cmd /?</b></summary><div>

```
cmd /?
Windows コマンド インタープリターの新しいインスタンスを開始します。

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]

    [[/S] [/C | /K] 文字列]

/C      "文字列" に指定されたコマンドを実行した後、終了します。
/K      "文字列" に指定されたコマンドを実行しますが、終了しません。
/S      /C または /K の後の文字列の扱いを変更します
        (以下の説明を参照してください)。
/Q      エコーをオフにします。
/D      レジストリからの AutoRun コマンドの実行を無効にします
        (下記を参照してください)。
/A      内部コマンドの出力結果を ANSI でパイプまたはファイルに出力します。
/U      内部コマンドの出力結果を Unicode でパイプまたはファイルに出力します。
/T:fg   前景色および背景色を設定します (詳細は COLOR /? を参照してください)。
/E:ON   コマンド拡張機能を有効にします (以下の説明を参照してください)。
/E:OFF  コマンド拡張機能を無効にします (以下の説明を参照してください)。
/F:ON   ファイル名およびディレクトリ名補完文字を有効にします
        (以下の説明を参照してください)。
/F:OFF  ファイルおよびディレクトリ名補完文字を無効にします
        (以下の説明を参照してください)。
/V:ON   区切り文字として ! を使って遅延環境変数の展開を有効にします。
        たとえば、/V:ON とすると、!var! は、実行時に変数 var を展開します。
        var 構文は、FOR ループ中とは違い、入力時に変数を展開します。
/V:OFF  遅延環境展開を無効にします。

コマンド セパレーター '&&' で区切られた複数のコマンドが引用符で囲まれている場合
は、"文字列" として指定されます。また互換性の理由から /X と /E:ON、/Y と
/E:OFF、および /R と /C は同じです。その他のスイッチは無視されます。

/C または /K が指定されている場合、スイッチの後の残りのコマンド ラインが
コマンド ラインとして処理されます。次のルールが引用符 (") の処理に使われます:

    1.  次のすべての条件に一致する場合、コマンド ラインの引用符が有効になり
        ます:

        - /S スイッチがない
        - 引用符が 1 組ある
        - 引用符の中に特殊文字がない
          (特殊文字は &<>()@^| です)
        - 引用符の中に 1 つ以上のスペースがある
        - 引用符の中の文字列が、実行可能ファイルの名前である

    2.  最初の文字が引用符であるにも関わらず上の条件に一致しない場合は、最初
        の引用符とコマンド ラインの最後の引用符が削除され、最後の引用符の後
        のテキストが有効になります。

コマンド ラインで /D が指定されなかった場合は、CMD.EXE の開始時に次の REG_SZ
または REG_EXPAND_SZ レジストリ変数が検索されます。次のレジストリ変数の両方
またはどちらかが存在する場合、それらを最初に実行します。

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

        および/または

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun

既定では、コマンド拡張機能は有効です。拡張機能を無効にして CMD.EXE を
起動するには、/E:OFF スイッチを使用します。コンピューターまたは
ユーザー ログオン セッションで起動される CMD.EXE コマンド
すべてに対して拡張機能を有効または無効にするには、REGEDIT.EXE を使って
レジストリにある次の REG_DWORD 値を設定します。コンピューターに対しては、

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions

に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。
ログオン セッションに対しては、

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions

に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。
ユーザー固有の設定は、コンピューターの設定より優先されます。
コマンド ライン スイッチは、レジストリの設定より優先されます。

バッチ ファイルでは、SETLOCAL ENABLEEXTENSIONS または DISABLEEXTENSIONS 引数は
/E:ON または /E:OFF スイッチよりも優先されます。詳細については SETLOCAL /? を
参照してください。

コマンド拡張機能には、次のコマンドに対する変更または追加が含まれています。

    DEL または ERASE
    COLOR
    CD または CHDIR
    MD または MKDIR
    PROMPT
    PUSHD
    POPD
    SET
    SETLOCAL
    ENDLOCAL
    IF
    FOR
    CALL
    SHIFT
    GOTO
    START (外部コマンドの起動の変更を含みます)
    ASSOC
    FTYPE

詳細は、コマンド名の後に「/?」と入力すると表示されるヘルプを参照してください。
レジストリにある次の
REG_DWORD 値を設定します。コンピューターに対しては、

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions

に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。
ログオン セッションに対しては、

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions

に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。
ユーザー固有の設定は、コンピューターの設定より優先されます。
コマンド ライン スイッチは、レジストリの設定より優先されます。

バッチ ファイルでは、SETLOCAL ENABLEEXTENSIONS または DISABLEEXTENSIONS 引数は
/E:ON または /E:OFF スイッチよりも優先されます。詳細については SETLOCAL /? を
参照してください。

コマンド拡張機能には、次のコマンドに対する変更または追加が含まれています。

    DEL または ERASE
    COLOR
    CD または CHDIR
    MD または MKDIR
    PROMPT
    PUSHD
    POPD
    SET
    SETLOCAL
    ENDLOCAL
    IF
    FOR
    CALL
    SHIFT
    GOTO
    START (外部コマンドの起動の変更を含みます)
    ASSOC
    FTYPE

詳細は、コマンド名の後に「/?」と入力すると表示されるヘルプを参照してください。

既定では、遅延環境変数の展開は有効ではありません。遅延環境変数の展開を有効また
は無効にして CMD.EXE を起動するには、/V:ON または /V:OFF スイッチを使います。
コンピューターまたはログオン セッションで起動される CMD.EXE コマンドすべてに対
して遅延の展開を有効または無効にするには、REGEDIT.EXE を使ってレジストリにある
次の REG_DWORD 値を設定します。コンピューターに対しては、

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion

に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。
ユーザー ログオン セッションに対しては、

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。
ユーザー固有の設定は、コンピューターの設定より優先されます。
コマンド ライン スイッチは、レジストリの設定より優先されます。

バッチ ファイルでは、SETLOCAL ENABLEEXTENSIONS または DISABLEEXTENSIONS
引数は /V:ON または /V:OFF スイッチよりも優先されます。
詳細については SETLOCAL /? を参照してください。

遅延環境変数の展開が有効になっている場合、感嘆符を使うと実行時に環境変数の
値を置き換えることができます。

CMD.EXE の特定の起動のファイル名補完機能を有効または無効にするには、/F:ON
または /F:OFF スイッチを使用します。コンピューターとユーザー ログオン セッション
またはそのいずれかで起動される CMD.EXE コマンドすべてに対して補完機能を有効
または無効にするには、REGEDIT.EXE を使ってレジストリにある次の REG_DWORD 値を
設定します。コンピューターに対しては、

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\CompletionChar
    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\PathCompletionChar

に特定の機能に使う 16 進の制御文字を設定します (例 0x4 は Ctrl-D、0x6 は
Ctrl-F)。ユーザー ログオン セッションに対しては、

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\CompletionChar
    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\PathCompletionChar

に特定の機能に使う 16 進の制御文字を指定します (例: 0x4 は Ctrl-D、0x6 は
Ctrl-F)。
ユーザー固有の設定は、コンピューターの設定より優先されます。
コマンド ライン スイッチは、レジストリの設定より優先されます。

/F:ON スイッチで補完機能を有効にした場合、2 つの制御文字 (Ctrl-D はディレ
クトリ名補完機能、Ctrl-F はファイル名補完機能) が使用されます。
レジストリで特定の補完文字を無効にするには、制御文字として有効でないスペース
(0x20) の値を使用します。

2 つの制御文字のどちらかを入力すると、補完機能が起動されます。
パスが存在しない場合、プログラムはカーソルの左側のパス文字列にワイルド
カード文字を付加し、一致するパスの一覧を作成します。その後一致する最初の
パスを表示します。パスが一致しない場合、音を鳴らします。同じ制御文字を押し
続けると一致するパスの一覧を順に表示します。Shift キーを押しながら制御文字
を押すと一覧を逆回り表示します。行を編集して制御文字をもう一度押すと、保存
されていた一致したパスの一覧は破棄され、新しい一覧が作成されます。
ファイル名補完機能とディレクトリ名補完機能を切り替えたときも同様です。
2 つの制御文字の違いは、ディレクトリ補完文字がディレクトリ名だけを照合する
のに対し、ファイル名補完文字はファイルとディレクトリ名の両方を照合する点です。
ファイル補完機能が内部ディレクトリ コマンド (CD、MD または RD) に使用され
た場合、ディレクトリ補完機能と見なされます。

一致するパスの前後に引用符を付けると、補完機能コードでスペースまたは他の
特別な文字を含むファイル名が使用できるようになります。また、行の前に戻って
補完機能を起動した場合、補完機能が呼び出された時点でカーソルの右側に
あったテキストは破棄されます。

引用符が必要な特別な文字は次のとおりです:
     <スペース>
     &()[]{}^=;!'+,`~
```

</div></details>

<details><summary><b>wscript /?</b></summary><div>

![WSH_HELP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/0a5ec31d-ce10-6ef2-7634-3ab0f2afe5c7.jpeg)

</div></details>

</div></details>

# スタートアップフォルダへのアクセス

スタートアップフォルダにランチャーへのショートカットを配置する。

##「ファイル名を指定して実行」で開く
キーボードで、Win+X → R
「ファイル名を指定して実行」で ```shell:startup```

## 端末から開く
コマンドプロンプトや PowerShell で以下のように実行してもよい。

```batch:コマンドプロンプト
explorer "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup"
```

```powershell:PowerShell
explorer "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup"
```

※ エクスプローラのアドレスバーに直接パスを入力しても開けます。

## 参考とした文献

<details><summary>参考とした文献</summary><div>

Windows10 起動時にアプリを自動起動 - スタートアップに登録 - PC設定のカルマ
https://pc-karuma.net/windows-10-app-startup/

スタートメニューやスタートアップなどの特殊フォルダーの場所を素早く開く：Tech TIPS - ＠IT
https://www.atmarkit.co.jp/ait/articles/1401/24/news036.html

Environment variable may not expand %APPDATA% to the Application folder - Microsoft Support
https://support.microsoft.com/en-us/help/329308/environment-variable-may-not-expand-appdata-to-the-application-folder

</div></details>

# 付録：壁紙のレジストリキー
夜間に暗めの壁紙を設定する場合はこのキーが使えそう。

```batch:コマンドプロンプト
reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v WallPaper
```

```batch:実行結果
HKEY_CURRENT_USER\Control Panel\Desktop
    WallPaper    REG_SZ    C:\WINDOWS\web\wallpaper\Windows\img0.jpg
```

```batch:壁紙の変更例
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v WallPaper /t REG_SZ /d C:\Windows\Web\Wallpaper\Theme2\img12.jpg /f
rundll32.exe user32.dll,UpdatePerUserSystemParameters
```

※ RUNDLL32.EXE～の行は[参考文献](https://www.windows-commandline.com/change-windows-wallpaper-command-line/)からのコピペです。コマンドで WIN32API を直接叩いているっぽい？

※ 位置情報と組み合わせることで、時間経過に加え季節や天候の変化でも移り変わるデスクトップ壁紙を実現できるかもしれません。

## 参考とした文献

<details><summary>参考とした文献</summary><div>

Windows API (Windows) | Microsoft Docs
https://docs.microsoft.com/en-us/previous-versions//cc433218(v=vs.85)

Windows API - Wikipedia
https://ja.wikipedia.org/wiki/Windows_API

rundll32 | Microsoft Docs
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/rundll32

全関数一覧 | Coop!! - コープ - プログラム用資料サイト
https://www.ecoop.net/coop/api/function-list.html

Change windows wallpaper from command line | Windows Command Line — Windows Commands, Batch files, Command prompt and PowerShell
https://www.windows-commandline.com/change-windows-wallpaper-command-line/

user32.dll,UpdatePerUserSystemParameters - no longer works [Windows 7 Ultimate x64] | technet.microsoft.com
https://social.technet.microsoft.com/forums/windows/en-US/c5979d78-9732-41a7-8f7b-a9991e318b76/user32dllupdateperusersystemparameters-no-longer-works-windows-7-ultimate-x64

</div></details>

# 付録：Mouse Pointer Scheme のレジストリキー

```batch:失敗例
reg query "HKEY_CURRENT_USER\Control Panel\Cursors" /ve
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /ve /t REG_SZ /d "Windows 黒" /f
rundll32.exe user32.dll,UpdatePerUserSystemParameters

reg query "HKEY_CURRENT_USER\Control Panel\Cursors" /ve
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /ve /t REG_SZ /d "Windows 標準" /f
rundll32.exe user32.dll,UpdatePerUserSystemParameters

```

<details><summary><b>検証結果</b></summary><div>

```batch:検証結果
C:\>reg query "HKEY_CURRENT_USER\Control Panel\Cursors"

HKEY_CURRENT_USER\Control Panel\Cursors
    AppStarting    REG_EXPAND_SZ    %SystemRoot%\cursors\wait_r.cur
    Arrow    REG_EXPAND_SZ    %SystemRoot%\cursors\arrow_r.cur
    ContactVisualization    REG_DWORD    0x1
    CursorBaseSize    REG_DWORD    0x20
    GestureVisualization    REG_DWORD    0x1f
    Hand    REG_EXPAND_SZ
    Help    REG_EXPAND_SZ    %SystemRoot%\cursors\help_r.cur
    No    REG_EXPAND_SZ    %SystemRoot%\cursors\no_r.cur
    NWPen    REG_EXPAND_SZ    %SystemRoot%\cursors\pen_r.cur
    Scheme Source    REG_DWORD    0x2
    SizeAll    REG_EXPAND_SZ    %SystemRoot%\cursors\move_r.cur
    SizeNESW    REG_EXPAND_SZ    %SystemRoot%\cursors\size1_r.cur
    SizeNS    REG_EXPAND_SZ    %SystemRoot%\cursors\size4_r.cur
    SizeNWSE    REG_EXPAND_SZ    %SystemRoot%\cursors\size2_r.cur
    SizeWE    REG_EXPAND_SZ    %SystemRoot%\cursors\size3_r.cur
    UpArrow    REG_EXPAND_SZ    %SystemRoot%\cursors\up_r.cur
    Wait    REG_EXPAND_SZ    %SystemRoot%\cursors\busy_r.cur
    (既定)    REG_SZ    Windows 黒
    Pin    REG_EXPAND_SZ    %SystemRoot%\cursors\pin_r.cur
    Person    REG_EXPAND_SZ    %SystemRoot%\cursors\person_r.cur
    Crosshair    REG_EXPAND_SZ    %SystemRoot%\cursors\cross_r.cur
    IBeam    REG_EXPAND_SZ    %SystemRoot%\cursors\beam_r.cur


C:\>reg query "HKEY_CURRENT_USER\Control Panel\Cursors"

HKEY_CURRENT_USER\Control Panel\Cursors
    AppStarting    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_working.ani
    Arrow    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_arrow.cur
    ContactVisualization    REG_DWORD    0x1
    CursorBaseSize    REG_DWORD    0x20
    GestureVisualization    REG_DWORD    0x1f
    Hand    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_link.cur
    Help    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_helpsel.cur
    No    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_unavail.cur
    NWPen    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_pen.cur
    Scheme Source    REG_DWORD    0x2
    SizeAll    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_move.cur
    SizeNESW    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_nesw.cur
    SizeNS    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_ns.cur
    SizeNWSE    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_nwse.cur
    SizeWE    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_ew.cur
    UpArrow    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_up.cur
    Wait    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_busy.ani
    (既定)    REG_SZ    Windows 標準
    Pin    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_pin.cur
    Person    REG_EXPAND_SZ    %SystemRoot%\cursors\aero_person.cur
    Crosshair    REG_EXPAND_SZ
    IBeam    REG_EXPAND_SZ


C:\>
```

</div></details>

いくつかの値を同時に変更する必要がありそう。

<details><summary><b>試行錯誤過程</b></summary><div>

```batch:changecursor.bat（日本語を含むためcp932で保存）
reg query "HKEY_CURRENT_USER\Control Panel\Cursors"
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    AppStarting          /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\wait_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    Arrow                /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\arrow_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    ContactVisualization /t   REG_DWORD     /d   0x1 /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    CursorBaseSize       /t   REG_DWORD     /d   0x20 /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    GestureVisualization /t   REG_DWORD     /d   0x1f /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    Hand                 /t   REG_EXPAND_SZ /d   "" /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    Help                 /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\help_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    No                   /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\no_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    NWPen                /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\pen_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    "Scheme Source"      /t   REG_DWORD     /d   0x2 /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    SizeAll              /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\move_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    SizeNESW             /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\size1_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    SizeNS               /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\size4_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    SizeNWSE             /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\size2_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    SizeWE               /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\size3_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    UpArrow              /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\up_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    Wait                 /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\busy_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    Pin                  /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\pin_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    Person               /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\person_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    Crosshair            /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\cross_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /v    IBeam                /t   REG_EXPAND_SZ /d   %SystemRoot%\cursors\beam_r.cur /f
reg add "HKEY_CURRENT_USER\Control Panel\Cursors" /ve                        /t   REG_SZ        /d   "Windows 黒" /f
reg query "HKEY_CURRENT_USER\Control Panel\Cursors"
```

反映には再ログインが必要。即座反映出来ないか？

```
rundll32 user32.dll,UpdatePerUserSystemParameters
rundll32 user32.dll,SystemParametersInfo SPI_SETCURSORS
rundll32 user32.dll,SetSystemCursor
```

失敗。パラメータを上手く与えられていないっぽい。
コードページの問題や新しい API への対応などを考えると[参考文献](https://devblogs.microsoft.com/scripting/use-powershell-to-change-the-mouse-pointer-scheme/)のように PowerShell スクリプトで作るのが無難か？

</div></details>

## 参考とした文献

<details><summary>参考とした文献</summary><div>

Use PowerShell to Change the Mouse Pointer Scheme | Scripting Blog - devblogs.microsoft.com
https://devblogs.microsoft.com/scripting/use-powershell-to-change-the-mouse-pointer-scheme/

今さら(今こそ?)Win32関数 プロセスのウインドウ外のマウスカーソルを変更するSetSystemCursor()、元に戻すSystemParametersInfo(SPI_SETCURSORS) - osamuk's blog
http://osamuk.hatenablog.jp/entry/2014/12/20/160818

Windows7の”個人設定”の指定をコマンドでできませんか？ - social.technet.microsoft.com
https://social.technet.microsoft.com/Forums/sqlserver/ja-JP/85b571ef-829a-4009-97c7-2a1dfa40821b/windows7?forum=powershellja

SystemParametersInfoA function (winuser.h) | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-systemparametersinfoa

Windows 7 - How do I access the "SystemParametersInfo " function in a batch file? | Windows Forum
https://windowsforum.com/threads/how-do-i-access-the-systemparametersinfo-function-in-a-batch-file.92600/

pinvoke.net: SystemParametersInfo (user32)
https://www.pinvoke.net/default.aspx/user32/SystemParametersInfo.html

Rundll(32).exeについて - Programming Field
https://www.pg-fl.jp/program/rundll.htm

</div></details>

# 付録：Microsoft Edge の Theme のレジストリキー
キーは見つかったが、残念ながら reg コマンドで変更しても反映されなかった。
"8wekyb3d8bbwe"の部分はハードコードしたくなかったので、別のキーから切り出してみた。

```batch:失敗例
for /f "usebackq delims==" %i in (`reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ProductOptions /v OSProductPfn`) do set CURRENT_SYSTEM_ID=%i
reg query "HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_%CURRENT_SYSTEM_ID:~-13%\MicrosoftEdge\Main" /v Theme
reg add "HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_%CURRENT_SYSTEM_ID:~-13%\MicrosoftEdge\Main" /v Thememe /t REG_DWORD /d 0 /f
```

 - Theme の値
  - 1：Dark
  - 0：Light

その後、変なことをせずに直接キーを叩くと問題なく変更できた。

<details><summary><b>成功例</b></summary><div>

```batch:成功例
C:\>reg query "HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\Main" /v Theme

HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\Main
    Theme    REG_DWORD    0x1


C:\>reg add "HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\Main" /v Theme /t REG_DWORD /d 0 /f
この操作を正しく終了しました。

C:\>reg query "HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\Main" /v Theme

HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\Main
    Theme    REG_DWORD    0x0


C:\>
```

</div></details>

※ 変更の反映には Edge の再起動が必要でした。なお、```rundll32.exe user32.dll,UpdatePerUserSystemParameters``` は Edge には効果がありませんでした。

## 参考とした文献

<details><summary>参考とした文献</summary><div>

How do I change the current Windows theme programmatically? - Stack Overflow
https://stackoverflow.com/questions/546818/how-do-i-change-the-current-windows-theme-programmatically

スクリプト Enable Windows 10 Dark Theme | gallery.technet.microsoft.com
https://gallery.technet.microsoft.com/scriptcenter/Enable-Windows-10-Dark-4bde0173

[Windows10]Edgeの各種設定に対応するレジストリ: システム構築　四苦八苦
http://tk-2015-2.seesaa.net/article/424260425.html

Windows 10ミニTips(86) Microsoft Edgeをコマンドラインから起動する | マイナビニュース
https://news.mynavi.jp/article/win10tips-86/

</div></details>

# 付録：Location API ？

[Armin2208/Windows-Auto-Night-Mode](https://github.com/Armin2208/Windows-Auto-Night-Mode) や [t1m0thyj/WinDynamicDesktop](https://github.com/t1m0thyj/WinDynamicDesktop) は、OS の位置情報にアクセスして現在地における日の出日の入り時刻の自動算出を行うことが出来る。では cmd.exe や powershell.exe、もしくは pwsh.exe からはどうか？という興味。

ググったところ、この API は PowerShell からは問題なく叩けるっぽい。

とはいえ、コマンドプロンプトからは厳しいのかな？もし rundll32.exe で System.Device.dll から Location API を叩けるなら何とかなりそうだけど。

## 参考とした文献

<details><summary>参考とした文献</summary><div>

PowerShellで位置情報を取得する - PowerShell Scripting Weblog
http://winscript.jp/powershell/288

GPSによる位置情報の取得 - Hatada's Home Page
http://home.a00.itscom.net/hatada/gis/gps01.html

rundll32.exeを悪用した命令の実行 - Binary Pulsar
https://binary-pulsar.hatenablog.jp/entry/2018/11/05/083000

rundll32.exeとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word13321.html

geolocation - Powershell: Getting GPS Coordinates in Windows 10 - Using Windows Location API? - Stack Overflow
https://stackoverflow.com/questions/46287792/powershell-getting-gps-coordinates-in-windows-10-using-windows-location-api

How to query latitude and longitude of Windows 10 device in PowerShell? - Stack Overflow
https://stackoverflow.com/questions/36144271/how-to-query-latitude-and-longitude-of-windows-10-device-in-powershell

System.Device.Location Namespace | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/api/system.device.location?view=netframework-4.8

Windows 10 において Location API で位置情報の取得ができない。
https://social.msdn.microsoft.com/Forums/ja-JP/d2a027d8-235f-47ef-bc41-2ee02b776f17/windows-10-12395123621235612390-location-api?forum=windowsgeneraldevelopmentissuesja

</div></details>

# WinDynamicDesktop
Mac の DynamicDesktop を Windows で利用可能にするアプリ。MPLライセンス。

ストアから入手出来るほか、GitHubのリリースページからポータブルなzipアーカイブやインストーラプログラムとして入手可能。

Mac のテーマを Windows で使うのは使用許諾的に大丈夫なのだろうか？便利だがその点がやや不安。

## 配布元

<details><summary>配付元</summary><div>

GitHub - t1m0thyj/WinDynamicDesktop: Port of macOS Mojave Dynamic Desktop feature to Windows 10
https://github.com/t1m0thyj/WinDynamicDesktop

ストア
https://www.microsoft.com/ja-jp/p/windynamicdesktop/9nm8n7dq3z5f

GitHub のリリースページ
https://github.com/t1m0thyj/WinDynamicDesktop/releases

GitHub の Wiki ページ
https://github.com/t1m0thyj/WinDynamicDesktop/wiki

テーマ
https://windd.info/themes/

</div></details>

## アクセントカラーの自動選択と併用する

設定 ＞ 個人用設定 ＞ 色

「背景から自動的にアクセントカラーを選ぶ」にチェック。

ダイナミックデスクトップの色合いの変化に対応してアクセントカラーも変化していく。心躍るエクスペリエンス。素敵なユーザー体験。

![2019-10-20 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/5537ee99-df5a-5ca2-fa30-93cc94390654.png)

※ アクセントカラーの自動選択機能は Mac にも欲しいです。

## 参考とした文献
毎日同じじゃつまらない！ デスクトップの壁紙を自動で切り替えて気分を一新 - 窓の杜
https://forest.watch.impress.co.jp/docs/shseri/win10cust/1201299.html

# Windows でも Night Shift

夜は穏やか暖色系で、昼はすっきり寒色系で、快適プログラミング生活。

## OS 標準機能

設定 ＞ システム ＞ ディスプレイ ＞ 夜間モード

夜間モードを ON 。

![2019-10-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/0a0f9c7f-5745-1617-d40c-5b3277dcd69c.png)


## f.lux

Windows/macOS/Linux/Android/iOS 対応の色温度自動調整ツール。

## 配布元

<details><summary>配付元</summary><div>

公式サイト
https://justgetflux.com/

ストア
https://www.microsoft.com/ja-jp/p/flux/9n9kdphv91jt

f.lux End User License Agreement
https://justgetflux.com/news/pages/eula/

</div></details>

### 参考とした文献
時間帯に応じてモニターの色温度を自動調整する無償ツール「f.lux」が“ストア”に登場 - 窓の杜
https://forest.watch.impress.co.jp/docs/news/1062108.html