程序中设定主显示器问题

 这里只给出了主要函数.其他显示器相关信息可参数,我的资源中的 " 设置主显示器.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 还是不错的..

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值