見出し画像

複数ディスプレイの設定(切替)GUIをつくってみた

ディスプレイを3枚接続しているとWindows+Pのディスプレイ切替だと満足できないんですよね。そこで自分が思った通りのディスプレイ接続状態にする切替GUIをPythonで作ってみました。もろもろつまづいたところと解消方法を書いておきます。

できたものを先に紹介!

何をしたか完成品を見てもらうのが一番早い。


やりたいこと/つまづきどころ

列挙します。

  1. ディスプレイ設定をコマンドプロンプトから指定したい

  2. dccmd.exeが効かない?

  3. モニター名が汎用pnpモニターになり指定できない

  4. モニター非接続状態だとモニター名から指定できない

  5. コマンドプロンプトで実行した結果を変数に代入したい

  6. GUIをつくりたい

  7. 多ボタンマウスを押すと表示する設定にしたい

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さんのサイト。

レジストリエディタで変える部分
名前を付ける
XPPENとかONKとかLivingTVとか設定した値に変わっている

レジストリ設定変えると、-listmonitorsしたときの表示が変わります!

4.モニター非接続状態だとモニター名から指定できない

ただ、上の画像からもわかるように接続していないとMonitorの名前が出ないのです。(上の画像だとDISPLAY3)

だが!それを解消したものがありました!

Display Changer II | 12noon

ありがてぇ。
これだと現状の設定(ディスプレイの関係位置やどれがメインモニターか、どのモニターが接続状態かなど)を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作って見たかったので勉強にもなった。

おしまい。


この記事が気に入ったらサポートをしてみませんか?