テーマの自動変更
ナビゲーションに移動
検索に移動
概要[編集]
Windowsのテーマ設定に合わせて、Meryのエディタ部のテーマを自動変更します。
Meryのオプションで、「アプリのテーマ」を「システム設定を使用する」とすると、Windowsに合わせてMeryのテーマが変更されるようになりますが、エディタ部のテーマはこれとは別に設定変更する必要があります。
Microsoft PowerToysの Light Switch や、Auto Dark Modeなどを使用すると、Windowsのテーマを時間で自動変更するなどができますが、Mery本体はこれに追随するのに、エディタ部のテーマだけ置き去りになって、なんか悲しかったので作りました。
- Meryのオプション->「基本」->「アプリのテーマ」で、「システム設定を使用する」としている場合のみ動作するようにしてあります。
- ライトモード/ダークモード用のテーマを用意しておき、マクロ先頭でテーマ名を指定します
- (Mery標準のテーマは使えません、「名前を付けて保存」したテーマを使用します)
- マクロのカスタマイズ画面のリストに登録したら、イベントを有効にします
- イベントはお好みで...(「フォーカスを受け取った時」「フォーカスを失った時」くらいが妥当だと思います)
テーマを書き換えるアイディアは、ucky様の「テーマのトグル」マクロからいただきました。 すてきなアイディアありがとうございます。
変更履歴[編集]
- 2025-12-10
- 新規作成
ソースコード[編集]
#title = "テーマの自動変更"
// ライトモード/ダークモード用のテーマを用意しておき、ここでテーマ名を指定します
// (Mery標準のテーマは使えません、「名前を付けて保存」したテーマを使用します)
var lightModeTheme = "#Custom-Light";
var darkModeTheme = "#Custom-Dark";
// マクロのカスタマイズ画面のリストに登録したら、イベントを有効にします
// イベントはお好みで...(「フォーカスを受け取った時」「フォーカスを失った時」くらいが妥当だと思います)
// Meryのオプション->「基本」->「アプリのテーマ」で、
// 「システム設定を使用する」としている場合のみ動作するようにしてあります
if ("ReadSettings" in editor) {
if(editor.ReadSettingInteger("General", "DarkMode", -1) == 2){
// Meryの現在のテーマ
var currentTheme = editor.ReadSettingString("Themes", "ThemeName", "");
// Windowsのテーマ状態
var regKey = "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\\AppsUseLightTheme";
var isLight = (new ActiveXObject("WScript.Shell")).RegRead(regKey);
var newTheme;
if(isLight == 0){
newTheme = darkModeTheme;
}else{
newTheme = lightModeTheme;
}
if(currentTheme != newTheme){
// 表示設定項目一覧取得
var iniKeys = enumKeysInSection("Theme\\" + newTheme);
if(iniKeys.length > 0){
editor.WriteSettings();
// テーマを「名前を付けて保存」したときに設定ファイルに追加される
// [Theme\テーマ名] セクションを読んで [Display] セクションの該当する項目を書き換える
for(var i = 0; i < iniKeys.length; i++){
editor.WriteSettingString("Display", iniKeys[i],
editor.ReadSettingString("Theme\\" + newTheme, iniKeys[i], "")
);
}
editor.WriteSettingString("Themes", "ThemeName", newTheme);
editor.ReadSettings();
}else{
window.OutputBar.Visible = true;
window.OutputBar.Writeln("指定されたテーマが見つかりません: " + newTheme);
}
}
}
}else{
window.OutputBar.Visible = true;
window.OutputBar.Writeln("動作対象外のMeryです: Ver." + editor.Version);
}
// Mery.iniから指定セクションのキー名一覧を取得する
function enumKeysInSection(sectionName){
var keys = [];
// Mery.ini を探す
var iniPath = editor.FullName.replace(/\.exe$/i, ".ini");
if(! (new ActiveXObject("Scripting.FileSystemObject")).FileExists(iniPath)){
var iniName = /\\([^\\]+)\.exe$/.exec(editor.FullName)[1];
iniPath = (new ActiveXObject("WScript.Shell")).SpecialFolders("APPDATA") + "\\Mery\\" + iniName + ".ini";
}
// Mery.ini を読みこむ
var adodb = new ActiveXObject("adodb.Stream");
var adTypeText = 2, adReadAll = -1;
adodb.Type = adTypeText, adodb.Charset = "UTF-8";
adodb.Open();
adodb.LoadFromFile(iniPath);
var iniText = adodb.ReadText(adReadAll);
adodb.Close();
var start = iniText.search(new RegExp("^\\[" + sectionName.replace(/\W/g, "\\$&") + "\\]$", "m"));
if(start >= 0){
start = start + sectionName.length + 4;
var end = iniText.indexOf("\r\n[", start);
if(end < 0) end = iniText.length;
var rows = iniText.slice(start, end).split("\r\n");
for(var i = 0; i < rows.length; i++){
var keyEnd = rows[i].indexOf("=");
if(keyEnd > 0){
keys.push(rows[i].slice(0, keyEnd));
}
}
}
return keys;
}
スポンサーリンク