因此,从本质上讲,我们正在编写一个服务级应用程序,它可以更改各种用户级设置的属性。我现在正在处理显示部分。
我们已经让它适用于我们的Windows7版本的软件,除了在Windows XP中旋转显示屏之外,几乎所有的东西都可以工作(奇怪的是,它确实可以在Windows 7中工作)。微软提供的Windows API中的"ChangeDisplaySettingsEX“函数返回错误显示模式(DISP_CHANGE_BADMODE)的返回码,因此我尝试应用该标志来允许”不安全“显示模式(因为我是一个叛逆者。是的,我将尝试不安全的显示模式,注意:我们正在处理一个糟糕的**s)。应用该标志会导致函数返回错误标志参数(DISP_CHANGE_BADFLAGS)。
经过进一步调查,Windows XP显然没有本机旋转显示器的方法。然而,我们可以找到一种方法,但它是通过英特尔(IEGD)提供的一个单独的驱动程序。对我来说,这意味着两件事:第一,没有办法通过Windows以非编程的方式做到这一点,也没有办法通过Windows API调用做到这一点。第二,如果英特尔找到了编写驱动程序的方法,那么一定有办法做到这一点。
我将在下面放一些代码,很抱歉这是一种tl;dr。tl;dr版本可能只是这篇文章的标题,我想...
..。
else if( key == "Rotation" ) {
QString rotationsStr = value.toString();
QStringList rotations = rotationsStr.split(",", QString::SkipEmptyParts);
for( int i = 0; i < currentLayout.size(); i++){
WinMon tempMon = currentLayout.at(i);
DWORD dwTemp = tempMon.dm.dmPelsHeight;
if(rotations.size() > 1) {
switch( rotations.at(i).toInt(&ok, 10) )
{
case 0: // Rotate 0 degrees
tempMon.dm.dmFields = DM_DISPLAYORIENTATION;
if(currentLayout.at(i).dm.dmDisplayOrientation == DMDO_90 ||
currentLayout.at(i).dm.dmDisplayOrientation == DMDO_270){
tempMon.dm.dmPelsHeight= tempMon.dm.dmPelsWidth;
tempMon.dm.dmPelsWidth = dwTemp;
tempMon.dm.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT;
}
tempMon.dm.dmDisplayOrientation = DMDO_DEFAULT;
break;
case 1: // Rotate 90 degrees
tempMon.dm.dmFields = DM_DISPLAYORIENTATION;
if(currentLayout.at(i).dm.dmDisplayOrientation == DMDO_DEFAULT ||
currentLayout.at(i).dm.dmDisplayOrientation == DMDO_180){
tempMon.dm.dmPelsHeight= tempMon.dm.dmPelsWidth;
tempMon.dm.dmPelsWidth = dwTemp;
tempMon.dm.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT;
}
tempMon.dm.dmDisplayOrientation = DMDO_90;
break;
case 2: // Rotate 180 degrees
tempMon.dm.dmFields = DM_DISPLAYORIENTATION;
if(currentLayout.at(i).dm.dmDisplayOrientation == DMDO_90 ||
currentLayout.at(i).dm.dmDisplayOrientation == DMDO_270){
tempMon.dm.dmPelsHeight= tempMon.dm.dmPelsWidth;
tempMon.dm.dmPelsWidth = dwTemp;
tempMon.dm.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT;
}
tempMon.dm.dmDisplayOrientation = DMDO_180;
break;
case 3: // Rotate 270 degrees
tempMon.dm.dmFields = DM_DISPLAYORIENTATION;
if(currentLayout.at(i).dm.dmDisplayOrientation == DMDO_DEFAULT ||
currentLayout.at(i).dm.dmDisplayOrientation == DMDO_180){
tempMon.dm.dmPelsHeight= tempMon.dm.dmPelsWidth;
tempMon.dm.dmPelsWidth = dwTemp;
tempMon.dm.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT;
}
tempMon.dm.dmDisplayOrientation = DMDO_270;
break;
}
}
else
{
switch( rotations.at(0).toInt(&ok, 10) ) {
case 0: // Rotate 0 degrees
tempMon.dm.dmFields = DM_DISPLAYORIENTATION;
if(currentLayout.at(i).dm.dmDisplayOrientation == DMDO_90 ||
currentLayout.at(i).dm.dmDisplayOrientation == DMDO_270){
tempMon.dm.dmPelsHeight= tempMon.dm.dmPelsWidth;
tempMon.dm.dmPelsWidth = dwTemp;
tempMon.dm.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT;
}
tempMon.dm.dmDisplayOrientation = DMDO_DEFAULT;
break;
case 1: // Rotate 90 degrees
tempMon.dm.dmFields = DM_DISPLAYORIENTATION;
if(currentLayout.at(i).dm.dmDisplayOrientation == DMDO_DEFAULT ||
currentLayout.at(i).dm.dmDisplayOrientation == DMDO_180){
tempMon.dm.dmPelsHeight= tempMon.dm.dmPelsWidth;
tempMon.dm.dmPelsWidth = dwTemp;
tempMon.dm.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT;
}
tempMon.dm.dmDisplayOrientation = DMDO_90;
break;
case 2: // Rotate 180 degrees
tempMon.dm.dmFields = DM_DISPLAYORIENTATION;
if(currentLayout.at(i).dm.dmDisplayOrientation == DMDO_90 ||
currentLayout.at(i).dm.dmDisplayOrientation == DMDO_270){
tempMon.dm.dmPelsHeight= tempMon.dm.dmPelsWidth;
tempMon.dm.dmPelsWidth = dwTemp;
tempMon.dm.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT;
}
tempMon.dm.dmDisplayOrientation = DMDO_180;
break;
case 3: // Rotate 270 degrees
tempMon.dm.dmFields = DM_DISPLAYORIENTATION;
if(currentLayout.at(i).dm.dmDisplayOrientation == DMDO_DEFAULT ||
currentLayout.at(i).dm.dmDisplayOrientation == DMDO_180){
tempMon.dm.dmPelsHeight = tempMon.dm.dmPelsWidth;
tempMon.dm.dmPelsWidth = dwTemp;
tempMon.dm.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT;
}
tempMon.dm.dmDisplayOrientation = DMDO_270;
break;
}
}
currentLayout.replace(i, tempMon);
}
}我们应用以下设置:
long returnCode;
for( int i=0; i < currentLayout.size(); i++ ){
WinMon myMon = currentLayout.at(i);
returnCode = ChangeDisplaySettingsEx(myMon.name.utf16(),(DEVMODE*)&(myMon.dm), NULL, CDS_UPDATEREGISTRY|CDS_NORESET, NULL);
if( returnCode != DISP_CHANGE_SUCCESSFUL )
{
qWarning() << "Failed to change display " << i;
qWarning() << "Return Code: " << returnCode;
qWarning() << " ";
qWarning() << "DISP_CHANGE_SUCCESSFUL : " << DISP_CHANGE_SUCCESSFUL;
qWarning() << "DISP_CHANGE_BADDUALVIEW : " << DISP_CHANGE_BADDUALVIEW;
qWarning() << "DISP_CHANGE_BADFLAGS : " << DISP_CHANGE_BADFLAGS;
qWarning() << "DISP_CHANGE_BADMODE : " << DISP_CHANGE_BADMODE;
qWarning() << "DISP_CHANGE_BADPARAM : " << DISP_CHANGE_BADPARAM;
qWarning() << "DISP_CHANGE_FAILED : " << DISP_CHANGE_FAILED;
qWarning() << "DISP_CHANGE_NOTUPDATED : " << DISP_CHANGE_NOTUPDATED;
qWarning() << "DISP_CHANGE_RESTART : " << DISP_CHANGE_RESTART;
qWarning() << " ";
qWarning() << "Again, your return value was: " << returnCode;
return false;
}
}
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
return true;因此,特别是底部的代码并没有写得特别优雅,但这是因为我们试图在清理它之前掌握如何做到这一点。
那么,有没有人知道如何在Windows XP中以这种方式旋转显示器?
发布于 2012-03-09 05:59:23
XP中的整个显示和监视器并不像在WDDM中那样清晰。虽然您可以枚举“附加”到显示器的监视器,但不能通过调用ChangeDisplaySettingsEx来更改监视器的模式。要更改显示模式,可以使用显示调用CDSE,例如"\.\Display1“或类似的东西。我以前花了大量的时间在XP上使用这些功能,我不认为你可以用它们做你想做的事情。
据我所知,屏幕旋转是XP下显示驱动程序的一个实现细节,并且没有从用户空间实现这一点的标准方法。调用EnumDisplaySettings时,某些英特尔驱动程序会列出纵向模式。通过将您的显示设置为这些模式之一,您最终会得到一个旋转的屏幕。
简而言之,对于所有显卡供应商来说,没有标准的方法可以做到这一点。但是你也许可以做他们的工具应用程序做的相同的事情来达到效果。
在Windows 7中,旋转和镜像由操作系统提供。This link应该会告诉你在Win7下事情是如何工作的。恐怕XP没有类似的东西。
https://stackoverflow.com/questions/9625057
复制相似问题