ウチツクシ

ゲームをしたり作ったり

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

f:id:K-s:20160619184957p:plain

多分できる、で試してなかった。できたけど 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

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