複数ディスプレイの設定(切替)GUIをつくってみた
ディスプレイを3枚接続しているとWindows+Pのディスプレイ切替だと満足できないんですよね。そこで自分が思った通りのディスプレイ接続状態にする切替GUIをPythonで作ってみました。もろもろつまづいたところと解消方法を書いておきます。
できたものを先に紹介!
何をしたか完成品を見てもらうのが一番早い。
やりたいこと/つまづきどころ
列挙します。
ディスプレイ設定をコマンドプロンプトから指定したい
dccmd.exeが効かない?
モニター名が汎用pnpモニターになり指定できない
モニター非接続状態だとモニター名から指定できない
コマンドプロンプトで実行した結果を変数に代入したい
GUIをつくりたい
多ボタンマウスを押すと表示する設定にしたい
1.ディスプレイ設定をコマンドプロンプトから指定したい
dccmd.exeを使います。コマンドプロンプトで下記を実行。
dccmd.exe -listmonitors
ディスプレイ情報がでるはず。
デフォルトでパス通ってる気がします。
おおもとは12noonさん?12noon製?のDISPLAY CHANGERです。
(自分でインストールしたか、デフォルトで入ってたか覚えてないけど…。)
Display Changer | 12noon
コマンドプロンプトからディスプレイ設定を変えられる優れもの!
後述しますがDISPLAY CHANGER Ⅱもあり天才の所業。
2.dccmd.exeが効かない?
64ビットだとdc64cmd.exeかもしれません。
dc64cmd.exe -listmonitors
引数にいろいろ入れると接続状態を設定できる。
dc64cmd.exe -monitor="\.\DISPLAY1" -secondary -width=1920 -height=1080 -ty=0 -lx=0
3.モニター名が汎用pnpモニターになり指定できない
なんかわからないが3枚のディスプレイが汎用pnpモニター扱いになり、それぞれを固定で指定できませんでした。DISPLAY1空き、DISPLAY2接続、DISPLAY3空き状態だと、それまでDISPLAY3として使っていたディスプレイがDISPLAY1扱いで接続されてしまうときもあり。どうやらDISPLAYは空いている番号から埋まるようです。
Windowsでディスプレイ詳細を確認すると名前は出るので、どこかに設定があるはず…。
と思っていろいろネットを探しましたらヒットしたのはやはり12noonさんのサイト。
レジストリ設定変えると、-listmonitorsしたときの表示が変わります!
4.モニター非接続状態だとモニター名から指定できない
ただ、上の画像からもわかるように接続していないとMonitorの名前が出ないのです。(上の画像だとDISPLAY3)
だが!それを解消したものがありました!
ありがてぇ。
これだと現状の設定(ディスプレイの関係位置やどれがメインモニターか、どのモニターが接続状態かなど)をxmlに出力し、再度そのxmlを読み込めば反映されます。ここでいう”どのモニターが接続状態か”が、対象のモニターが非接続状態でも動作するんです。天才かよ。
5.コマンドプロンプトで実行した結果を変数に代入したい
Python上でGUIを実装しよう思い進めました。最新の接続状態を表示したいのでdc64cmd.exe -listmonitorsで状態を取得したい。実行結果のなかに”汎用pnpモニター代わりつけた名前”、ここではONK(ONKYOのモニターの意味)などが含まれていたら接続されていると判断させたい。
sys.os(***.cmd) (だったかな?)だと出力しかされないので、subprocessを使います。
importして、
import subprocess
こんな感じにするとデコードした状態で変数(ここではDinf)に格納されます。
Dinf = subprocess.check_output(['dc64cmd.exe', '-listmonitors'], shell=True).decode()
6.GUIをつくりたい
ようやくGUIの話にきました。使ったのはpython標準ライブラリのtkinter。これはググるといろいろ出てくるので経過だけ紹介します。
動画バージョンは冒頭のものになります。
7.多ボタンマウスを押すと表示する設定にしたい
ここはもういつものよくある感じ。
まず、.pyを.pywにするとコマンドプロンプトが表示されないらしい?
らしいです。今回は作成したプログラムをDisplaySwitcher.pywとしています。
.pywを実行するcmdを作成 (↓ _RunDisplaySwitcher.cmd)
python DisplaySwitcher.pywpython DisplaySwitcher.pyw
これをコマンドプロンプト表示無しで実行するvbsを作成 (↓ _RunDisplaySwitcher.vbs)
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c _RunDisplaySwitcher.cmd", vbhide
これらは全て同じ階層に置いてある。
で、AutoHotKeyで呼び出す。AutoHotKeyでこんな感じで指定する。
ポイントとしてはファイル指定だけじゃなく、その後にディレクトリも指定するみたい。
Run, c:\***\_RunDisplaySwitcher.vbs, c:\***\
おしまいに
これでおしまい!
眠すぎて雑な文章だけど誰かの役に立つはず。
何か上手い方法とか、もっと知りたいってのがあればコメントを。
GUI作って見たかったので勉強にもなった。
おしまい。
この記事が気に入ったらサポートをしてみませんか?