最近朋友有個需求,希望可以在Switch和電腦之間互相快速切換螢幕畫面。友人的螢幕是21:9寬螢幕,從電腦切換到16:9比例的Switch後,螢幕自動將16:9的畫面拉伸為21:9,需要手動從OSD切換。使用螢幕上的按鈕要伸手按好幾次,切換輸入再更改顯示比例,非常不便。於是我就幫忙用Nirsoft的Control My Monitor搭配AutoHotKey來達成一建切換螢幕輸入加切換比例!
Nirsoft的Control My Monitor是透過DDC/CI協議來跟螢幕溝通。目前大多數的螢幕都有支援DDC/CI協議,至少我遇過的螢幕都有支援。使用前可以在螢幕OSD選單中確認DDC/CI功能有沒有啟用。而Control My Monitor裡面的選項是由螢幕提供的,所以不同螢幕廠商可能會有點不同。
要切換螢幕輸入來源,我們需要的選項是Input Select
。而切換比例則是Display Scaling
,不過我的螢幕沒支援,所以上面圖片沒顯示這個選項。至於要輸入什麼數值就需要自己試驗一下。Control My Monitor除了直接雙擊打開執行,還可以在指令界面中執行。Nirsoft網站上有詳細的指令教學。這裡我簡單介紹兩個用到的指令,一個是讀取選項的數值,另一個就是寫入數值。
# 讀取目前主螢幕的輸入源。60代表要讀取哪個選項
ControlMyMonitor.exe /GetValue Primary 60
# 數值會以return code形式返回
echo %errorlevel%
# 寫入數值,切換螢幕輸入源
ControlMyMonitor.exe /SetValue Primary 60 1
這裡提一個陷阱,如果直接使用cmd一句一句來執行,會拿不到return code。需要在前面加上:
start /wait ControlMyMonitor.exe /GetValue Primary 60
echo %errorlevel%
要達到一鍵切換,我們可以用AutoHotKey來寫一個簡單的程式來執行Control My Monitor。
#Requires AutoHotkey v2.0
SWITCH_INPUT := 17
LAPTOP_INPUT := 15
SCALE_16_9_VALUE := 20
CODE_INPUT_SELECT := 60
CODE_SCALING := 86
CTRL_MON_EXE := "controlmymonitor.exe"
; Monitor short name
MON_NAME := "AOCB306"
!F11::
{
; Get current input source
returnValue := RunWait(format("{} /GetValue {} {}", CTRL_MON_EXE, MON_NAME, CODE_INPUT_SELECT))
; Check if the return value is equal to 15
If (returnValue = LAPTOP_INPUT) {
; Switch input source to "Switch"
RunWait(format("{} /SetValue {} {} {}", CTRL_MON_EXE, MON_NAME, CODE_INPUT_SELECT, SWITCH_INPUT))
Sleep 2000
; Set display scaling to 16:9
RunWait(format("{} /SetValue {} {} {}", CTRL_MON_EXE, MON_NAME, CODE_SCALING, SCALE_16_9_VALUE))
} Else {
; Switch input source to laptop
RunWait(format("{} /SetValue {} {} {}", CTRL_MON_EXE, MON_NAME, CODE_INPUT_SELECT, LAPTOP_INPUT))
}
}
我們指定按下ALT+F11的時候執行。首先取得目前螢幕的輸入來源,判斷接下來需要切換到電腦還是Switch。如果目前是電腦畫面,就切換到Switch,等待兩秒後再切換顯示比例到16:9。相反就切回電腦。即使目前顯示畫面不是電腦也能正常切換。
注意這裡我使用了名字來指定要選擇哪個螢幕(因為友人的電腦是筆記本,有兩個螢幕)。螢幕資訊可以從Control My Monitor界面中按Ctrl+M來複製。如果你只有一個螢幕,直接指定Primary就可以了。
就這樣成功解決了一個小煩惱~