- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
因此,从本质上讲,我们正在编写一个服务级应用程序,它可以更改各种用户级设置的属性。我现在正在研究显示部分。
我们已经让它适用于我们的 Windows 7 软件版本,除了在 Windows XP 中旋转显示器(奇怪的是,它在 Windows 7 中确实有效)外,几乎所有功能都可以正常工作。 Microsoft 提供的 Windows API 中的“ChangeDisplaySettingsEX”函数正在返回错误显示模式 (DISP_CHANGE_BADMODE) 的返回码,因此我尝试应用标志以允许“不安全”显示模式(因为我是反叛者。是的,我'我会尝试不安全的显示模式,请注意:我们正在处理这里的问题)。应用该标志导致函数返回错误标志参数 (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 中以这种方式旋转显示吗?
最佳答案
XP 中的整个显示和监视器并不像 WDDM 中那样清晰。虽然您可以枚举“附加”到显示器的监视器,但您不能通过调用 ChangeDisplaySettingsEx 来更改监视器的模式。要更改显示模式,您可以使用显示调用 CDSE,例如"\\.\Display1"或类似的东西。我前世在 XP 上花了很多时间玩弄这些功能,但我认为您不能用它们做您想做的事。
据我所知,屏幕旋转是 XP 下显示驱动程序的一个实现细节,并且没有从用户空间执行此操作的标准方法。当您调用 EnumDisplaySettings 时,某些 Intel 驱动程序会列出纵向模式。通过将显示器设置为其中一种模式,您最终会得到一个旋转的屏幕。
简而言之,没有适用于所有显卡供应商的标准方法。但是您也许可以做他们的实用程序所做的同样的事情来达到效果。
在 Windows 7 下,旋转和镜像由操作系统提供。 This link应该向您提供有关 Win7 下工作原理的详细信息。恐怕没有适合 XP 的东西。
关于c++ - 在 Windows XP 中以编程方式旋转显示? (C++/Qt 和 WindowsAPI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9625057/
问题是不言自明的。如果重要的话,我正在为 USB 驱动器命名。 谢谢。 最佳答案 32 characters in NTFS, 11 in FAT. 关于windows-xp - Windows XP
我在我的 macbook(lion os)上使用并行桌面,我想让 xampp/localhost 在我安装的 XP 版本上工作,这样我就可以在 Internet Explorer 中测试我的网站。 显
我将如何创建自己的 XP 打印机驱动程序,它将执行以下操作: 打印到文件(可能是 XPS 格式) 将此文件放入密码 protected ZIP 文件 将 zip 文件通过电子邮件发送到已配置的 电子邮
我记得看过 Mark Russinovich 的网络广播,显示了用户启动的内核转储的键盘按键序列。有人可以按键的确切顺序刷新我的内存。 请注意,这是针对 XP 的。 最佳答案 http://psaca
我父亲找到了一个他非常喜欢的俄语键盘映射here .但是,它是非标准的,因此不会出现在键盘布局选择的语言(控制面板->区域和语言选项->语言->详细信息->文本服务和输入语言->添加)下拉列表中。据我
我想将 Chocolatey 与某些 Windows XP VM 一起使用。不幸的是,Chocolatey 要求告诉我们至少需要 Windows 7。( https://chocolatey.org/
是否有官方的 Windows XP 注册表引用在线某处?我看到 Win 2000 有一个引用和 Win 2003 MS technet 上的服务器,但我似乎找不到适用于 XP 的服务器。是的,我知道
我有一个带有第三方应用程序的四核系统,偶尔会旋转多个进程(始终是相同的可执行文件,但有多个实例)并占用 100% 的 CPU 时间。我还在同一个机器上运行了几个 Web 服务(IIS 和第三方)。 所
我正在寻找“RunOnceEx”的反向版本。 RunOnceEx 确实在用户的 shell(桌面和任务栏)启动之前运行一些程序。在 runonceex 完成之前,登录进度不会继续。 我想做完全相同的事
我有一个程序,我试图在两台计算机上运行。在一台电脑上,它工作正常。但是,在另一台计算机上,它在尝试创建 USB channel 时挂起。我没有能力查看程序内部。确定两台机器之间差异的最佳方法是什么?
Windows XP 绘制带有漂亮阴影的图标文本,这有助于阅读各种背景上的文本。字体颜色为白色,阴影为黑色(如果桌面背景为白色)或根本没有阴影(如果桌面背景为黑色)。 所以有两个子任务: 阴影是如何绘
有没有办法通过批处理脚本在 Windows XP 中创建用户,甚至为其分配管理员/受限用户值? 最佳答案 假设用户名是 rased 密码是 pAsS net user rased pAsS /add
我正在寻找使用 SP2 或 winsock 在 XP 上访问 A2DP、AVRCP、MAP、HFP 等蓝牙配置文件的供应商独立方式。 我正在最终确定为蓝牙创建应用程序的方法。 除了服务发现之外,我还需
我想通过 Windows 代码包将 Direct2D 用于我的 .Net 应用程序。由于我的一些用户使用 XP,我需要提供 GDI+ 后备。我想知道人们通常如何进行这种后备。 他们是否将所有必要的图形
根据 Microsoft 文档,直到 Windows Vista,InterlockedCompareExchange64 才可用作 Windows API 调用。见 http://msdn.micr
计算机管理 -> 服务和应用程序 -> 消息队列 如何从特定队列中删除消息? 在我看来有一些方法,但我现在找不到。 最佳答案 嗯,不可能通过 MMC 删除有害消息。 你可以试试QueueExplore
Windows XP 中存储的用户帐户图标/图片在哪里? (显示在非经典登录屏幕和开始菜单上的那些。) 最佳答案 C:\Document and Settings\All Users\Applicat
在 WinXP 上安装时,出现以下错误 在 Win7 应用程序上安装没有问题。 Windows 窗体应用程序和 WPF 应用程序都存在相同的问题,并且在 VS 2010 之前它们都可以正常工作。 最佳
是否可以在 Windows XP 上的 Visual Studio 中使用/引用 Microsoft.Web.Administration?我知道,在 XP 上安装 IIS 7 是不可能的,但我(必须
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一名优秀的程序员,十分优秀!