Synapseのユーザープロファイルを読み込んで、ターボ機能が有効かどうか判定するコードです。
ハードウェアにプロファイルを保存する機能を搭載している機種(Razer Basilisk Ultimate等)は検知できませんが・・・。
node.js v16.13.1で動作確認しました。
const fs = require('fs');
var exec = require('child_process').exec;
//プロファイルの存在するディレクトリ
const base_path = process.env.ProgramData + '\\Razer\\Razer Central\\Accounts';
console.log("[マクロチェックを起動しました]");
//1秒に1度マクロチェック
setInterval(main, 1000);
function main(){
//ユーザープロファイルを列挙する
const files = fs.readdirSync(base_path);
let check_dirs = [];
files.forEach(element => {
const _s = element.substr( 0, 4 );
if(_s == 'RZR_')
check_dirs.push(element);
});
//検出:1 未検出:0 エラー発生:-1
const macro_check_status = checkMacro(check_dirs);
//console.log("\n")
switch(macro_check_status.isMacro){
case true:
console.log("'" + macro_check_status.profile + "'プロファイルでマクロを検出しました");
/*exec('taskkill /im AVA.exe /F', (err, stdout, stderr) => {
if (err) {
console.log("AVAの強制終了に失敗しました");
}else{
console.log("完了");
}
console.log("マクロチェックを終了します");
process.exit(1)
}
)*/
break;
case false:
//console.log("マクロは検出されませんでした");
break;
default:
console.log("チェック中にエラーが発生しました");
break;
}
}
function checkMacro(check_dirs){
let report = {isMacro:false, profile:""};
//ユーザープロファイルを一つずつ調べる
check_dirs.forEach(chkdir => {
//console.log(`\n------プロファイルディレクトリ${chkdir}------`);
const dev_path = base_path + "\\" + chkdir + "\\Emily3\\Devices";
//すべての登録マウスを調べる
const mouses = fs.readdirSync(dev_path);
mouses.forEach(mouse => {
//マウスプロファイルの保管パス
const pf_path = dev_path + "\\" + mouse + "\\";
//アクティブマウスプロファイルのIDと名前を取得
const xml = fs.readFileSync( pf_path + 'ActiveProfile.xml', "utf-8");
const active_profile = xml.slice(xml.indexOf("<ProfileId>") + 11, xml.indexOf("</ProfileId>"));
const active_profile_name = xml.slice(xml.indexOf("<Name>") + 6, xml.indexOf("</Name>"));
//console.log(`マウス${mouse}においてアクティブなプロファイルは${active_profile}です`);
//アクティブマウスプロファイルの設定データからマクロ設定を検索する
const profiles = fs.readdirSync(pf_path + 'Features\\' + active_profile);
profiles.forEach(profile => {
if(profile.slice("-4") == ".xml"){
const prof_xml = fs.readFileSync( pf_path + 'Features\\' + active_profile + "\\" + profile);
if(prof_xml.indexOf("<IsTurbo>true</IsTurbo>") > -1)
report = {isMacro:true, profile:active_profile_name}; //マクロ有効
}
});
});
});
return report;
}