曲名 | スコア | 記録 | 曲名 | スコア | 記録 | |||||
---|---|---|---|---|---|---|---|---|---|---|
天使の歌う小夜曲 | 67860 | (98.26%) | 69063 | 羽根のブランケットにつつまれて | 63776 | (100.00%) | 63776 | |||
Romantic Heart | 53652 | (92.72%) | 56664 | 花束の招待状 | 28633 | (100.00%) | 28633 | |||
Aozora Melody | 149383 | (98.41%) | 151789 | らぶりーすまいる | 185443 | (94.34%) | 195577 | |||
私だけのsoleil | 76017 | (91.52%) | 81372 |
RH→soleil→花束。さくっと終了。
昨日の続きで、ウィンドウモードを用いた仮想フルスクリーンだとプライマリモニタ以外も使用できるという結構大きな利点がある事に気がついたので、使用するモニタを選べるようにしようと改装中。
やるだけなら簡単なんですが、設定画面のUIの問題でモニタ名を取得するのが大変でした。EnumDisplayDevicesだとドライバレベルの名称(Generic PnP Monitorとか)しか取得できないのですが、Windowsの解像度設定画面だとちゃんとモニタ名出てるので何かやる方法があるのでは…と調べていました。
結論はWindows7から使えるようになったQueryDisplayConfig関数とDisplayConfigGetDeviceInfo関数を用いればOKです。ただ使い方がなかなか分かりづらく、まず
で、多分PATHの方のdpis[0]~dpis[numofpath-1]がそれぞれのモニタを表しているので、その情報を取得してあげればいいっぽいです。それぞれsourceInfoメンバとtargetInfoメンバがあり、ソースがグラフィックカード、ターゲットがモニタのようです。
i番目のモニタのグラフィックカード側は
モニタ側は
#とりあえず使い終わったらdpisとdmisは忘れずに
昨日の続きで、ウィンドウモードを用いた仮想フルスクリーンだとプライマリモニタ以外も使用できるという結構大きな利点がある事に気がついたので、使用するモニタを選べるようにしようと改装中。
やるだけなら簡単なんですが、設定画面の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手動トラックバック