C#でレジストリを書き換える
C#で作るアプリケーションの内容によってはレジストリの値を書き換える必要がある場合があります。
私自身C言語で同じようなことをしたことがありましたが、C#では初めてレジストリ書き換えを行ったので、備忘録として残しておきます。
テーマ
今回は、レジストリの値を取得し、「ライトモードが設定されていたらダークモードへ変更する」ようなコードを書いてみます。
注意
本プログラムはレジストリを操作しますが、レジストリはWindowsにとって大変重要なものです。
実際にテストは行っていますが、万が一プログラムが誤っていた場合は実行するとレジストリが破損しWindowsの実行が不可能になってしまう可能性があります。
操作は慎重に行って下さい。また、クリーンインストールしても問題ない予備のPC等で実行することをオススメします。
本コードはWindows10の最新バージョンでのみ実行可能であることを確認しているため、古いWin10やそれ以前の7等では動作確認していません。注意して下さい。
環境
OS:Windows10 Home 64bit 20H2適用済 ビルド19042.964
コンピューターの環境は以下の通りです。
参考
レジストリから値を読み込む - C#プログラミング
レジストリの値を設定するには?
C#でレジストリを操作する方法をわかりやすく解説!
↓特にこのサイトを一番参考にさせて頂きました。ありがとうございます。
C# Windows10のダークモードいいっすね!アプリケーションのダークモード設定を取得してみましょ!ヽ(^。^)ノ
レジストリいじりはMicrosoft.Win32名前空間を使えば可能
ググってみると、どうやらMicrosoft.Win32名前空間のOpenSubkeyメソッドとSetValueメソッドを利用すればレジストリの書き換えが可能らしい。
レジストリの書き換えには管理者権限が必要
レジストリの書き換えには管理者権限が必要であるため、管理者権限でアプリケーションを動作させる方法を記載しておきます。
プロジェクトの名前を右クリック→追加→新しい項目 の順番でクリックします。
「新しい項目の追加 - プロジェクト名」という以下のようなウィンドウが表示されたら、その中から「アプリケーション マニフェスト ファイル(Windows のみ)」という項目をクリックし、追加します。
追加できたら、ソリューションマネージャーの中に「app.manifest」のようなファイルが出ているかと思います。
先程の追加の過程で名前を変更した場合は違う名前になっているとは思いますが、少なくとも拡張子が「.manifest」のファイルが作成できていれば成功です。
続いてこのmanifestファイルを修正していきます。
標準ではこのようなファイルになっています。
この画像の真ん中ちょい上くらいに、「requestExecutionLevel」というのが見えていると思います。
こいつです↓
現在、このrequestExecutionLevelのlevelが「asInvoker」になっています。
これを以下のように「requireAdministrator」へ変更して下さい。
これをすることで、アプリケーション実行時にお馴染みの「ユーザーアカウント制御」が出現します。
これが出るだけでなんだか「それっぽく」なった気がしますねぇ・・・
以上でレジストリ書き換えの前準備は完了です。
実際にレジストリの書き換えを実行
実際に書き換えを実行していきます。
まず「Microsoft.Win32名前空間を利用する」旨をコードの先頭に記載します。
using Microsoft.Win32;
いよいよ書き換えを行います。
その前に・・・今回書き換えるレジストリを確認
Windows10でダークモードを司るレジストリは2種類あります。
1つめがこれ↓
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize\SystemUsesLightTheme
こいつはシステム(Windowsのタスクバーとか)がダークモードの配色を利用するかどうかを決めます。
2つめがこれ↓
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme
これはWindows上で動作するアプリケーション(Webブラウザとか)がダークモードの配色を利用するかどうかを決めます。
もともとWindows10の標準は1つめの「SystemUsesLightTheme」が0(つまりダーク)で、「AppsUseLightTheme」が1(つまりライト)です。
それが2020年のどこかのアップデートでライト・ダークが選べるようになったと記憶しています。
今回動作させるアプリケーションは、Windows10が最新版にアップデートされている前提で作成します。
つまりこのレジストリが「存在する」前提で作成を進めるので、もし古いバージョンのWindowsも対象にしたい場合は「キーの存在確認」を入れる必要があります。
書き換えコード
int getmode = 5;
string rKeyName = @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize";
string rGetValueName = "AppsUseLightTheme";
Microsoft.Win32.RegistryKey rKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(rKeyName, true);
getmode = (int)rKey.GetValue(rGetValueName);
if(getmode == 1)
{
rKey.SetValue("AppsUseLightTheme", 0);
rKey.SetValue("SystemUsesLightTheme", 0);
rKey.Close();
}
string rKeyNameでは、レジストリの場所を指定しています。
レジストリエディターの上部に表示されているようなパスです。
ちなみにここへの指定で「コンピューター」も「HKEY_CURRENT_USER」も不要です。
string rGetValueName = "AppsUseLightTheme";
Microsoft.Win32.RegistryKey rKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(rKeyName, true);
getmode = (int)rKey.GetValue(rGetValueName);
そしてここでキーをint型で取得しています。
rGetValueNameは取得するレジストリの名前です。
今回は「AppsUseLightTheme」を指定しています。
Systemの方は前述の通りWindowsの標準が「システムはダークのアプリがライト」というものなので、システムはもともと「ダーク」になっている可能性が非常に高いために「システム」側のモードのチェックは行っていません。
OpenSubKeyの第2引数「true」は、書き込み可能モードで開くことを指定しています。
getmode変数にはint型で取得されたAppsUseLightThemeの値が記されています。
if(getmode == 1)
{
rKey.SetValue("AppsUseLightTheme", 0);
rKey.SetValue("SystemUsesLightTheme", 0);
rKey.Close();
}
そしてgetmodeが1(つまり、アプリのモードがライト)だった場合、Software\Microsoft\Windows\CurrentVersion\Themes\PersonalizeのAppsUseLightThemeとSystemUsesLightThemeの値を0にする(ダークにする)という意味です。
rKey.Close();は、レジストリを閉じています。
まとめ
C#でレジストリをいじるには「Microsoft.Win32名前空間」が使える
レジストリのパスは「HKEY_CURRENT_USER」以前は不要。
レジストリも使い終わったら閉じる
以上です。ありがとうございました。
↧