一鍵切換螢幕輸入!使用AutoHotKey和DDC/CI協議


最近朋友有個需求,希望可以在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。

AHK Script
#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就可以了。

就這樣成功解決了一個小煩惱~


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *