子供がPCでフォートナイトの時間を守らなかったり、やめなさいと言ってもなかなか聞かなかったりして、妻のイライラ、子供もイライラ、あまり良くない状態だったので、もう親子であれこれ言い合わなくていいように一定の条件を満たしたらフォートナイトが強制的にシャットダウンされるようにして見た。
方法は色々あると思うけど、pythonを選んだ。
Windows上でpythonのスクリプトをサービスとして実行し、Fortniteを起動した瞬間にプロセス監視で開始したことを検知したり、自分でゲームをやめたことも検知する。かつ、一定の条件を満たしているかどうかを1分に1回判定して、場合によってはFortniteを強制終了させる。自分でも試してみたけど、ほんとに一瞬でアプリがシャットダウンされてデスクトップに戻される。
作るスクリプトは以下。適当な名前.pyで保存
import sys
import time
import wmi
import win32serviceutil
import logging
import psutil
from plyer import notification
logging.basicConfig(
filename = 'C:\\Users\\xxxxxxxxx\\xxxxxx\\gamemonitorscript.log',
level = logging.DEBUG,
format="%(asctime)s:LINE[%(lineno)s] %(levelname)s %(message)s"
)
class GameMonitorService(win32serviceutil.ServiceFramework):
_svc_name_ = 'FNMoniter'
_svc_display_name_ = 'Monitor Game'
_svc_description_ = 'Saving over playing'
def SvcDoRun(self):
self.run = True
loopcount = 0
c=wmi.WMI()
cre_process_watcher=c.Win32_Process.watch_for("creation")
del_process_watcher=c.Win32_Process.watch_for("deletion")
while self.run:
new_cre_process=cre_process_watcher()
new_del_process=del_process_watcher()
if("FortniteClient" in new_cre_process.Caption):
# ここで、お、ゲームやり始めたなというときの処理
if("FortniteClient" in new_del_process.Caption):
# ここで、ゲームをやめたとときの処理
time.sleep(1)
loopcount += 1
if loopcount == 60:
# いい加減にしなさい、ゲーム強制終了ですよ、という判定をする
if <<<何かしらのやりすぎ判定>>>:
logging.debug('強制終了')
for proc in psutil.process_iter():
n = proc.name()
if "FortniteClient" in n:
p = psutil.Process(proc.pid)
proc.kill()
loopcount = 0
def SvcStop(self):
self.run = False
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(SampleService)
これを管理者ユーザでコマンドプロンプトからサービスとしてインストールして実行されていることを確認する。当然、pythonは事前にインストールして、pipでpywin32というパッケージもインストールしておく必要があるけど、その辺は以下の記事を見て参考にさせていただいた。
https://qiita.com/Bashi50/items/1d98f80ccaa8746bff38
正直、WMIとかなんとか、使い方があんまり良くわかってなくて、適当にやっててこれで動いたから、まあいいか、という感じ。