🐲

【ドラゴンクエストXオンライン】ゲーム中は SwitchBot の電源プラグで Do Not Disturb ランプを点灯する

2024/10/13に公開

基本コンセプト

EnumWindows() のコールバックで WNDCLASSNAME に一致するものがあれば起動中とする

DND ランプは SwitchBot の電源プラグにつながっていて、状況でプラグのオンオフをするだけなので 1分に 1回の Cloud API アクセスでも 10000 times / day のリクエスト回数制限には引っかからないが、叩きすぎな気もするので BLE に変更したいところ……

例によってタスクトレイに常駐

  • DQXboot.exe と同時にこれを起動し一定時間 DQXgame.exe (SQEX.CDev.Engine.Framework.MainWindow) が起動していなければ終了するようにすれば API 叩きすぎも解消できるはず
  • OBS Studio などに置き換えることで配信勢もランプオンオフが可能
  • 複数プログラムの検出も対応可能なのでいずれかが検出されれば DND!

みたいな改良ができると思います

基本部分ソース

from win32gui import EnumWindows, GetClassName

WNDCLASSNAME = 'SQEX.CDev.Engine.Framework.MainWindow'
deviceID = 'xxxxxxxxxxxx'


class DQX:
    def __init__(self):
        self.switchbot = SwitchBot()

    def detect(self):
        self.proc = None

        def EnumWindowsProc(hWnd):
            if GetClassName(hWnd) == WNDCLASSNAME:
                self.proc = hWnd

        EnumWindows(lambda hWnd, _: EnumWindowsProc(hWnd), None)

        if self.proc is None:
            # print('not running, turn off plug')
            self.switchbot.set_device_power(deviceID, 'off')
        else:
            # print('running, turn on plug')
            self.switchbot.set_device_power(deviceID, 'on')

叩き台としての repo

https://github.com/sharl/DND-detector

Discussion