次のように、ボタンクリックでプライマリモニターを切り替える小さなアプリケーションを作成しました。
Monitor 0 --> Monitor 1 --> Monitor 2
ボタンをクリックするたびに、プライマリ モニターが 3 つの間で切り替わります。
ボタンをクリックするたびにモニターを正常に切り替えることができ、モニターの座標は
(0,0)
(1920,0)
(3840,0)
3つのケースすべてで達成することもできます。ただし、モニターをモニター 2 からモニター 0 に切り替えようとすると、次のモニター座標が返されます。
(0,0)
(0,0)
(1920,0)
ChangeDisplaySettingEx 関数はエラーを返さず、モニターは期待どおりに機能します。返された座標が正しくないため、配置しようとしているウィンドウが正しく配置されていません。2 番目の画面に配置する必要があるウィンドウは、最初の画面に配置されます。
これは、現在モニターを切り替える方法のコードサンプルです。
next_position++;
if(next_position>2)
{
next_position=0;
}
POINTL posPrimary={0};
posPrimary.x=0
posPrimary.y=0;
DEVMODE mode_primary = {0};
mode_primary.dmSize = sizeof(mode_primary);
mode_primary.dmFields = DM_POSITION;
mode_primary.dmPosition = posPrimary;
LONG status = ChangeDisplaySettingsEx(
nameofMonitor[next_position],
&mode_primary,
nullptr, // reserved
CDS_SET_PRIMARY | CDS_UPDATEREGISTRY,
nullptr // no video parameter
);
if (DISP_CHANGE_SUCCESSFUL != status) {
printf("ChangeDisplaySettingsEx returned %d", status);
return -__LINE__;
}
int m =1;
for(int var =0; var<=2;var++)
{
posPrimary.y=0;
posPrimary.x=dxWidthPrimary*m;
m++;
DEVMODE mode_primary = {0};
mode_primary.dmSize = sizeof(mode_primary);
mode_primary.dmFields = DM_POSITION;
mode_primary.dmPosition = posPrimary;
if(var!=next_position)
{
status = ChangeDisplaySettingsEx(
nameofMonitor[var],
&mode_primary,
nullptr, // reserved
CDS_GLOBAL | CDS_UPDATEREGISTRY,
nullptr // no video parameter
);
if (DISP_CHANGE_SUCCESSFUL != status) {
printf("ChangeDisplaySettingsEx returned %d", status);
return -__LINE__;
}
}
}
ChangeDisplaySettingsEx (NULL, NULL, NULL, 0, NULL);
私のコードは期待どおりに動作するので、(0,0) を (3840,0) に変更して、この障害のある状態をオーバーライドする必要がありますか? ここで問題を見つけることができません