特定のディスプレイの解像度を変更する

多分できる、で試してなかった。できたけど ChangeDisplaySettings じゃなくて Ex 付きの方だった。前者はメインディスプレイしか変更できないよう。EnumDisplaySettings に DeviceName 渡してるから DEVMODE にその情報入ってるのかと思ったよ…
#include "user32.as"
screen 0, 400, 120
dim moniInfo, 10 + 8 ; MONITORINFOEX
moniInfo(0) = 40 + 32
dim devMode, 44 ; DEVMODE
*mainLoop
mx = ginfo_mx
my = ginfo_my
MonitorFromPoint mx, my, 0 ; MONITOR_DEFAULTTONULL
if (stat) {
GetMonitorInfo stat, varptr(moniInfo)
getstr dn, moniInfo, 40 ; szDevice
} else {
dn = ""
}
stick key, , 0
if (key & 32) : goto *genList
redraw 0
color 255, 255, 255 : boxf
color
pos 0, 0
mes strf("ginfo_mx,y = (%5d,%5d)", mx, my)
mes strf("DeviceName = %s", dn)
mes
mes "[Enter]を押すと現在マウスカーソルのあるモニタの"
mes "モード変更リストが表示されます"
redraw
await 15
goto *mainLoop
*genList
sdim buf
num = 0
repeat
EnumDisplaySettings dn, cnt, varptr(devMode)
if (stat == 0) : break
buf += strf("%4d x %4d", devMode(27), devMode(28))
buf += strf(", %2d bit, %3d hz", devMode(26), devMode(30))
buf += strf(", %x\n", devMode(14))
num++
loop
cls
SetWindowPos hwnd, 0, mx, my, 0, 0, $5
mes strf("DeviceName = %s", dn)
mes strf("ModeNum = %d", num)
mes
mes "リストから選んで変更ボタンを押してください"
objsize 100, 24
pos 280, 84
button gosub "変更", *changeMode
pos 20, 84
objsize 240
objmode 2
font msgothic, 14
combox idx, 0, buf
stop
*changeMode
EnumDisplaySettings dn, idx, varptr(devMode)
ChangeDisplaySettingsEx dn, varptr(devMode), 0, $4, 0 ; CDS_FULLSCREEN
res = stat
cls
SetWindowPos hwnd, 0, ginfo_mx, ginfo_my, 0, 0, $5
mes res
if (res) {
dialog "正常に変更できませんでした"
} else {
dialog "正常に変更されました\n終了すると元に戻ります"
}
goto *mainLoopモードの最後のパラメータは解像度は同じでも比率を無視して画面全体に引き延ばすとかそういう設定?
モード変更すると戻った時に元あったウィンドウのサイズが変わったり別のディスプレイに飛んだりするし、マルチディスプレイだと位置も変わったりするからあまりソフト側で弄りたくはないなあ。