お世話になっております。
お手数をおかけしますが、下記をご確認いただけますと幸いです。
発生環境:
DxLibライブラリ(UnicodeVer / DxLibW_x64.dll、ファイル更新日時2025/03/21時点のバージョン。恐縮ですが正確なバージョン番号は未確認です)
言語: C#(DxLibDotNet経由)
OS: Windows 11
ディスプレイ構成: プライマリ 1920x1080、セカンダリ(非プライマリ)1280x1024 の2画面構成
再現手順:
DxLib_Initより前に以下を呼び出す
DX.SetFullScreenResolutionMode(DX.DX_FSRESOLUTIONMODE_BORDERLESS_WINDOW);
DX.SetGraphMode(1920, 1080, 32);
DX.ChangeWindowMode(DX.FALSE); // フルスクリーン(ボーダーレスウィンドウ)
SetUseDisplayIndexで、解像度がSetGraphModeの指定と異なる非プライマリのディスプレイ(今回の環境ではインデックス1、1280x1024)を指定する
DxLib_Initを実行し、そのディスプレイ上でウィンドウが正しく表示されることを確認する
毎フレームGetMousePointで取得した座標を、実際のマウスカーソルの画面上の絶対座標と突き合わせて比較する
期待する動作:
GetMousePointは、ボーダーレスウィンドウが表示されているディスプレイ内でのカーソル位置を、SetGraphModeで指定した仮想解像度(1920x1080)に変換した座標として返してほしい。
実際の動作:
以下のように、カーソルの絶対画面座標に対して、対象ディスプレイの拡大率(1920÷1280=1.5倍)は正しく掛かっているものの、そのディスプレイ自体の仮想デスクトップ上でのオフセット位置(X=1920)が差し引かれずに計算されている。
カーソルの実際の絶対画面座標 GetMousePointの戻り値
(2320, 550) ※セカンダリディスプレイ(X=1920〜3200)上、ウィンドウが実際に表示されている位置 (3480, 597)
(400, 550) ※プライマリディスプレイ上(ウィンドウは表示されていない) (600, 597)
いずれもX座標は「絶対座標×1.5」になっており、セカンダリディスプレイのオフセット(1920)が考慮されていません。本来(2320,550)は「(2320-1920)×1.5=600」付近の値になるべきだと考えます。
この結果、非プライマリディスプレイ上でボーダーレスウィンドウを使う構成では、ウィンドウ内のどの位置にカーソルを置いてもGetMousePointが仮想解像度の範囲(0〜1920)を超えた値を返すことがあり、マウスによるUI操作(ボタンの当たり判定など)が実質的に機能しません。逆に、ウィンドウが表示されていないプライマリディスプレイ上でカーソルを動かした場合に、計算結果が偶然0〜1920に収まり、意図しない座標でUIが反応してしまう現象も確認しています。
推測される原因:
GetMousePoint(またはその内部で使われている座標変換処理)が、対象ディスプレイの解像度から算出した拡大率をカーソルの絶対座標にそのまま適用しており、対象ディスプレイの仮想デスクトップ上での位置(オフセット)を差し引く処理が抜けているのではないかと推測します。プライマリディスプレイ(オフセットが常に(0,0))を対象にした場合はこの問題が表面化しないため、気づかれにくい不具合ではないかと思います。
補足:
プライマリディスプレイを対象にした場合、および解像度が仮想解像度と一致するディスプレイを対象にした場合は問題を確認していません。あくまで「非プライマリディスプレイ」かつ「解像度が異なる」という組み合わせで発生する現象です。