Pythonを使ってWindowsがダークモード(ダークテーマ)かどうか調べる方法をサンプルソース付きで解説します。システムの設定に合わせてアプリもダークモードにする……みたいな感じで、PythonでGUIアプリを作るときなんかに使えると思います。
ただし、この方法はWindowsがダークモードに対応した「Windows 10 May 2019 Update(バージョン1903)」以降でないと動かないので注意してください。ダークモードに対応してないバージョンを使用している場合の例外処理も併せて書いておいた方がいいかもしれません。
レジストリを覗いてみる
プログラムがシステムの設定を覗くためには、まずレジストリを参照する必要があります。Windows10では、レジストリにシステムが今ライトテーマなのかダークテーマなのか記述してある部分がありますので、レジストリエディタで確認してみましょう。該当するレジストリキーは下記の場所にあります。
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize
「Personalize」の中に「AppsUseLightTheme」という値があります。これの値を見てみましょう。ダークテーマを使用している場合は「0」が、ライトテーマを使用している場合は「1」が代入されているはずです。なお、何かしらのエラーでイカれちゃってる場合は「-1」が代入されていると思います。
レジストリの使う部分
今回、まとめると次の部分を使います。
レジストリの場所 | HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize |
値の名称 | AppsUseLightTheme |
値 | ダークテーマ使用時:0 ライトテーマ使用時:1 |
もしPersonalizeがなかったときは?
もし「Personalize」がなかったときは無理やり作っちゃってください。右側のツリービューから「Themes」を右クリックして新しいノードを作成して名前を「Personalize」に変えてあげます。ぐれぐれも作成する場所を間違えないように気をつけてください。
作り終えたら、「Personalize」を右クリックして次のように値を作成します。こちらも上記同様間違えないように、慎重に操作してください。
データの種類 | [DWORD (32ビット) 値] |
値の名称 | AppsUseLightTheme |
値 | 0 |
Pythonでレジストリを参照する
さて、レジストリの存在を確認してみたところでいよいよPythonでレジストリを参照するコードを書きます。Pythonでレジストリを参照するときは「winreg」というモジュールを使います。pip installしなくても使えると思います。そう、Windowsならね。
レジストリを参照するプログラム
では実際にコードを書いていきます。
import winreg
path = r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"
key = winreg.OpenKeyEx(winreg.HKEY_CURRENT_USER, path)
data, regtype = winreg.QueryValueEx(key, "AppsUseLightTheme")
print("値 = " + data)
winreg.CloseKey(key)
これで「AppsUseLightTheme」の値が出力されるはずです。あとは「data」の値が0か1かで処理を分けてあげればとりあえずは完成です!レジストリを読み終えたら忘れずに「winreg.CloseKey(key)」しておきましょう。
ダークテーマかどうか判定するプログラム
先ほどのプログラムをこんなふうにちょこっと改良してあげるだけです。
import winreg
path = r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"
key = winreg.OpenKeyEx(winreg.HKEY_CURRENT_USER, path)
data, regtype = winreg.QueryValueEx(key, "AppsUseLightTheme")
if data == 0:
print("今はブラックなOSです。")
elif data == 1:
print("今はホワイトなOSです。")
else:
print("値がおかしいぞ!")
print("値 = " + data)
winreg.CloseKey(key)
これでWindowsがダークテーマかどうかで処理を分岐するプログラムは完成です!上記のサンプルではダークテーマかどうか判定して、printを使って文を出力するだけですが、これを応用すればGUIアプリを開発するときに便利!ユーザーの選択肢に「システムの設定に合わせる」が追加できますね。
まとめ
レジストリの値さえ間違えないように注意してしまえば、あとは簡単です。ダークテーマの値が「0」でライトテーマの値が「1」である点に注意してください。筆者はてっきりライトテーマの値が「0」だと思ってプログラムを作ったら眩しい画面を直視してしまいました。
これであなたのアプリもOSに合わせてダークになったりライトになったりできますね!