特定のディスプレイの解像度を変更する
多分できる、で試してなかった。できたけど 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
モードの最後のパラメータは解像度は同じでも比率を無視して画面全体に引き延ばすとかそういう設定?
モード変更すると戻った時に元あったウィンドウのサイズが変わったり別のディスプレイに飛んだりするし、マルチディスプレイだと位置も変わったりするからあまりソフト側で弄りたくはないなあ。