这里只给出了主要函数.其他显示器相关信息可参数,我的资源中的 " 设置主显示器.zip"
// 功能:设置主显示器
// 参数:lpszDeviceName ---- 需要设置为主显示器的设备名(对应于 结构体 st_MI的 mi_wDeviceName 字段 )l,
// 一般名类似于 "\\.\DISPLAY2"
// 返回值: true ----- 设置成功. false ---- 设置失败.
//
// 说明:要把某一台设为主显示器,必须先把需要设置为主显示器的显示器先设定.然后再设其他的显示器..
// 参考资料:
// http://social.msdn.microsoft.com/Forums/en/windowssdk/thread/95267766-8416-4f8a-be76-881ca8f32cc3
//
bool CMonitorList::setPrimaryMonitor(LPCTSTR lpszDeviceName)
{
DEVMODE deviceMode;
deviceMode.dmSize = sizeof(DEVMODE);
deviceMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS;
DISPLAY_DEVICE DisplayDevice;
ZeroMemory(&DisplayDevice, sizeof(DISPLAY_DEVICE));
DisplayDevice.cb = sizeof(DisplayDevice);
// 保存要设置为主显示器的设备,在没有设置为主显示前的左上角坐标..
// 作用:因为要把这设备设为主显示器,那么必须设置它的左上角坐标为(0,0), 那么其他的显示器的坐标也要相对于它不变,
// 但是坐标的原点(0,0) 位置已经从之前的变为现在设置后的. 所以都要把x坐标减去 old_Coord_X, y坐标减去old_Coord_Y..
int old_Coord_X = 0;
int old_Coord_Y = 0;
// 先设置主显示标识,并改变
for(int i = 0; EnumDisplayDevices(NULL, i, &DisplayDevice, 0); i++)
{
if(!(DisplayDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) && (DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
{
EnumDisplaySettings(DisplayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &deviceMode);
DWORD dwFlags = CDS_UPDATEREGISTRY | CDS_NORESET;
if (_tcscmp(lpszDeviceName, DisplayDevice.DeviceName) == 0)
{
old_Coord_X = deviceMode.dmPosition.x;
old_Coord_Y = deviceMode.dmPosition.y;
deviceMode.dmPosition.x = 0;
deviceMode.dmPosition.y = 0;
dwFlags |= CDS_SET_PRIMARY;
if (DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettingsEx(DisplayDevice.DeviceName, &deviceMode, NULL, dwFlags, NULL))
return false;
}
}
}
for(int i = 0; EnumDisplayDevices(NULL, i, &DisplayDevice, 0); i++)
{
if(!(DisplayDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) && (DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
{
EnumDisplaySettings(DisplayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &deviceMode);
// 这里计算位置相对于当前要设置为主显示器坐标的不变..
deviceMode.dmPosition.x -= old_Coord_X;
deviceMode.dmPosition.y -= old_Coord_Y;
DWORD dwFlags = CDS_UPDATEREGISTRY | CDS_NORESET;
if (_tcscmp(lpszDeviceName, DisplayDevice.DeviceName) != 0)
{
if (DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettingsEx(DisplayDevice.DeviceName, &deviceMode, NULL, dwFlags, NULL))
return false;
}
}
}
if (DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(0,0,0,0,0) )
{
return true;
}
else
{
return false;
}
}
相关链接:
http://blog.csdn.net/xuxinhua/article/details/7739753 这个不足是提供的东西一大片,看到头晕..
http://social.msdn.microsoft.com/Forums/en/windowssdk/thread/95267766-8416-4f8a-be76-881ca8f32cc3 这个最下面的那个 code snip 还是不错的..