ゲスト[ログイン]

おおいしゆうのASミュージックスコア登録CGI

おおいしゆうが日々のフォルテール演奏の記録を書き続けるCGI(日記じゃないです。blogでもないです)

工画堂スタジオ 『スマイル☆シューター ~ふぁーすと☆ちけっと~』OHP

パルフェ10周年ポータル パルフェ10周年寄せ書き企画

Aozora Melodyのパーフェクト動画公開中!

日 (今日 最終日)
日 ~ 日 (全部)
フォルテール総合情報サイト
ASミュージック
ポータル

同曲演奏状況
CSV登録
工画堂スタジオ&ヤマサ 『スマイル☆シューター ~ふぁーすと☆ちけっと~』応援中!
工画堂スタジオ 『ソルフェージュ~La finale~』OHP
曲名スコア記録曲名スコア記録
天使の歌う小夜曲67860(98.26%)69063羽根のブランケットにつつまれて63776(100.00%)63776
Romantic Heart53652(92.72%)56664花束の招待状28633(100.00%)28633
Aozora Melody149383(98.41%)151789らぶりーすまいる185443(94.34%)195577
私だけのsoleil76017(91.52%)81372
RH→soleil→花束。さくっと終了。

昨日の続きで、ウィンドウモードを用いた仮想フルスクリーンだとプライマリモニタ以外も使用できるという結構大きな利点がある事に気がついたので、使用するモニタを選べるようにしようと改装中。
やるだけなら簡単なんですが、設定画面のUIの問題でモニタ名を取得するのが大変でした。EnumDisplayDevicesだとドライバレベルの名称(Generic PnP Monitorとか)しか取得できないのですが、Windowsの解像度設定画面だとちゃんとモニタ名出てるので何かやる方法があるのでは…と調べていました。

結論はWindows7から使えるようになったQueryDisplayConfig関数とDisplayConfigGetDeviceInfo関数を用いればOKです。ただ使い方がなかなか分かりづらく、まず

	UINT32 numofpath;
	UINT32 numofmode;
	GetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT,&numofpath,&numofmode);
などとしてQueryDisplayConfigで情報を取得するのに必要なDISPLAYCONFIG_PATH_INFO構造体とDISPLAYCONFIG_MODE_INFO構造体の数を取得し(PATHとMODEがそれぞれ何を意味するのかはよく分からない…)、

	DISPLAYCONFIG_PATH_INFO *dpis=new DISPLAYCONFIG_PATH_INFO[numofpath];
	DISPLAYCONFIG_MODE_INFO *dmis=new DISPLAYCONFIG_MODE_INFO[numofmode];
	DISPLAYCONFIG_TOPOLOGY_ID tid;
	QueryDisplayConfig(QDC_DATABASE_CURRENT,&numofpath,dpis,&numofmode,dmis,&tid)
とすると現在のマルチモニタの設定が取得できます。numofpath,numofmodeは実際に取得した数に再設定されるようです。tidには拡張モードかクローンモードかみたいな情報が入って帰ってきます。

で、多分PATHの方のdpis[0]~dpis[numofpath-1]がそれぞれのモニタを表しているので、その情報を取得してあげればいいっぽいです。それぞれsourceInfoメンバとtargetInfoメンバがあり、ソースがグラフィックカード、ターゲットがモニタのようです。

i番目のモニタのグラフィックカード側は

	DISPLAYCONFIG_SOURCE_DEVICE_NAME dn;
	dn.header.type=DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
	dn.header.adapterId=dpis[i].sourceInfo.adapterId;
	dn.header.id=dpis[i].sourceInfo.id;
	dn.header.size=sizeof(dn);
	DisplayConfigGetDeviceInfo((DISPLAYCONFIG_DEVICE_INFO_HEADER*)&dn);
のように、DISPLAYCONFIG_SOURCE_DEVICE_NAME構造体をDISPLAYCONFIG_DEVICE_INFO_HEADERに偽装してDisplayConfigGetDeviceInfo関数を使って取得します。header.typeに設定する値と使う構造体が対応してます。ソース側を取得するのでadapterIdとidはdpis[i].sorurceInfoのものを使用。サイズはちゃんと設定しないとダメです。成功するとdn.viewGdiDeviceNameにWindowsからみたモニタのデバイス名が入って戻ってきます。このデバイス名はDISPLAY_DEVICE構造体のDeviceName(EnumDisplayDevicesとかEnumDisplaySettingsExとかChangeDisplaySettingsExで使用するもの)と同じです。

モニタ側は

	DISPLAYCONFIG_TARGET_DEVICE_NAME dn;
	dn.header.type=DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
	dn.header.adapterId=dpis[i].targetInfo.adapterId;
	dn.header.id=dpis[i].targetInfo.id;
	dn.header.size=sizeof(dn);
	DisplayConfigGetDeviceInfo((DISPLAYCONFIG_DEVICE_INFO_HEADER*)&dn);
です。SOURCEがTARGETに変わっただけですが、DISPLAYCONFIG_TARGET_DEVICE_NAMEにはたくさんメンバ変数があっていろいろな情報を取得しています。肝心なモニタ名はdn.monitorFriendlyDeviceNameです。他にもDISPLAYCONFIG_PATH_INFO自体やDISPLAYCONFIG_TARGET_DEVICE_NAMEにいろいろな情報が入っているので何かに使えるのではないかと。

#とりあえず使い終わったらdpisとdmisは忘れずにdelete [] dpisなどして開放しておきましょう(malloc/freeでもいいし、std::vector使うなら開放しなくてもOK)。あと個々で使った関数は成功すると戻り値はERROR_SUCCESSになるのでちゃんとチェックしましょう。
名前: ひとこと:
この記事へのトラックバックURL: https://www.asmusic.jp/ASHARD/score/tb.cgi/yu-oishi/20140823手動トラックバック