- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我想做的是使用 ChangeDisplaySettings 在 C# 中的主显示器上设置屏幕分辨率。我已经在我拥有的多台 Windows 7 计算机上对此进行了测试,结果始终相同:任何*有效的分辨率(右键单击桌面时在“屏幕分辨率”菜单中列出的分辨率)都可以正常工作,除了用于在该菜单中选择的最大分辨率,这将导致 User32.ChangeDisplaySettings 返回 -2,即 DISP_CHANGE_BADMODE,意味着请求的显示模式无效。
*在一些具有较大主显示器的计算机上,我没有费心测试每个分辨率,只是选择了一些任意较小的分辨率和最大分辨率,因为有太多的分辨率无法在每个分辨率上进行测试。我对我的测试有足够的信心,可以说最大分辨率总是失败,而较小的分辨率通常/总是成功(无论如何,在我的测试期间,它们中的任何一个都没有失败)。
有关 ChangeDisplaySettings 的文档:http://msdn.microsoft.com/en-us/library/dd183411%28VS.85%29.aspx
有关其使用的 DEVMODE 结构的文档:http://msdn.microsoft.com/en-us/library/dd183565%28v=vs.85%29.aspx
举个例子,假设我在 1920x1080 显示屏上运行。
我手动(或以编程方式)将分辨率设置为其他值,无论它是什么或如何更改,然后运行以下代码:
DEVMODE dm = new DEVMODE();
dm.dmDeviceName = new String(new char[32]);
dm.dmFormName = new String(new char[32]);
dm.dmSize = (short)Marshal.SizeOf(dm);
if (User32.EnumDisplaySettings(null, User32.ENUM_CURRENT_SETTINGS, ref dm) != 0)
{
dm.dmPelsWidth = 1920;
dm.dmPelsHeight = 1080;
Console.WriteLine("" + User32.ChangeDisplaySettings(ref dm, User32.CDS_UPDATEREGISTRY) + "\n");
}
*请注意,这实际上并不是程序中的代码。我只是制作了这个简化版本,将其简化为最基本的必要条件来说明这一点。
程序将打印出:
-2
如前所述,这是DISP_CHANGE_BADMODE的值,分辨率将无法更改。
现在,如果我将 1080 和 1920 的值分别更改为 900 和 1600(该显示器上支持的另一个分辨率),然后将分辨率设置为 1600x900 以外的其他值,然后运行该程序,它实际上会更改分辨率改为1600x900,并返回DISP_CHANGE_SUCCESSFUL。
请注意,使用其他标志(例如 CDS_RESET(0x40000000 或 1073741824))代替 CDS_UPDATEREGISTRY 也会导致相同的错误。
这是我发现可以帮助我入门的教程:
www.codeproject.com/Articles/6810/Dynamic-Screen-Resolution
[由于明显的垃圾邮件预防系统,我删除了超链接。有点愚蠢,因为第一个是 msdn.microsoft 链接,这是一个代码项目链接,但是,w/e]
请注意,在评论部分,似乎有人直接使用提供的源文件,并且遇到了类似的问题。引用他们的话:
hello , i'm using Resolution.cs on my c# application and it doesn't work with high resolutions like " 1366*768 " & " 1280*720 " can any one help ???
但是,尽管教程似乎经常推荐 ChangeDisplaySettings,但我找不到任何有关解决此问题的信息(这很可能是特定于操作系统的,但我目前缺乏任何非 Windows 7 计算机来测试) ,即使我这样做了,也无法解决在 Windows 7 计算机上无法运行的问题)
最佳答案
事实证明,我使用的教程假设在分辨率较低时不会将任何显示模式参数更改为无效的内容(例如提高刷新率,即限制在显示器一侧。由于我使用相同的两台显示器进行测试,并且最大分辨率的最大刷新率低于任何其他分辨率,因此我会遇到此问题。)
比教程中介绍的更安全的方法是使用显示模式的索引或仅使用 EnumDisplayModes,并且永远不要触摸 DEVMODE 结构内的数据。
以下是我编写的示例程序的摘录,该程序将分辨率更改为指定参数,然后再更改回来。
int selB, selG, selF, selH, selW;
... //these values get defined, etc.
DEVMODE OSpecs = new DEVMODE();
getCurrentRes(ref OSpecs);
int Ondx = getDMbySpecs(OSpecs.dmPelsHeight, OSpecs.dmPelsWidth, OSpecs.dmDisplayFrequency, OSpecs.dmDisplayFlags, OSpecs.dmBitsPerPel, ref OSpecs);
Screen Srn = Screen.PrimaryScreen;
Console.WriteLine("Current res is " + OSpecs.dmPelsHeight + " by " + OSpecs.dmPelsWidth + "\n");
DEVMODE NSpecs = new DEVMODE();
int Nndx = getDMbySpecs(selH, selW, selF, selG, selB, ref NSpecs);
//Note that this function sets both the DEVMODE to the selected display mode and returns the index value of this display mode. It returns -1 if it fails (-1 is the value of ENUM_CURRENT_SETTINGS), and sets the DEVMODE to the current display mode.
if (Nndx == -1)
{
Console.WriteLine("Could not find specified mode");
}
else if (setDisplayMode(ref NSpecs) || setDisplayMode(Nndx)) //This is just to illustrate both ways of doing it. One or the other may be more convenient (ie, the latter if you are getting this from a file, the former if you already have the DEVMODE in your program, etc.)
{
//reset display mode to original after waiting long enough to see it changed
Console.WriteLine("Successful change. Waiting 4 seconds.");
Thread.Sleep(4000);
if (setDisplayMode(ref OSpecs) || setDisplayMode(Ondx))
{
//success!
Console.WriteLine("Mode reversion succeeded.");
}
else
{
Console.WriteLine("Mode reversion failed. Manual reset required.");
}
}
else
{
//return
Console.WriteLine("Resolution change failed. Aborting");
}
这里使用的函数如下:
static bool setDisplayMode(int i)
{
DEVMODE DM = new DEVMODE();
DM.dmSize = (short)Marshal.SizeOf(DM);
User32.EnumDisplaySettings(null, i, ref DM);
if (User32.ChangeDisplaySettings(ref DM, User32.CDS_TEST) == 0 && User32.ChangeDisplaySettings(ref DM, User32.CDS_UPDATEREGISTRY) == 0)
{
return true;
}
else
{
return false;
}
}
static bool setDisplayMode(ref DEVMODE DM)
{
if (User32.ChangeDisplaySettings(ref DM, User32.CDS_TEST) == 0 && User32.ChangeDisplaySettings(ref DM, User32.CDS_UPDATEREGISTRY) == 0)
{
return true;
}
else
{
return false;
}
}
static int getDMbySpecs(int H, int W, int F, int G, int B, ref DEVMODE DM)
{
DM.dmSize = (short)Marshal.SizeOf(DM);
DEVMODE SelDM = new DEVMODE();
SelDM.dmSize = (short)Marshal.SizeOf(SelDM);
int iOMI = 0;
for (iOMI = 0; User32.EnumDisplaySettings(null, iOMI, ref SelDM) != 0; iOMI++)
{
if (( B == -1 || B == SelDM.dmBitsPerPel) && ( H == -1 || H == SelDM.dmPelsHeight) && ( W == -1 || W == SelDM.dmPelsWidth) && ( G == -1 || G == SelDM.dmDisplayFlags) && ( F == -1 || F == SelDM.dmDisplayFrequency))
break;
}
if (User32.EnumDisplaySettings(null, iOMI, ref DM) == 0)
{
iOMI = -1;
getCurrentRes(ref DM);
}
return iOMI;
}
static void getCurrentRes(ref DEVMODE dm)
{
dm = new DEVMODE();
dm.dmSize = (short)Marshal.SizeOf(dm);
User32.EnumDisplaySettings(null, User32.ENUM_CURRENT_SETTINGS, ref dm);
return;
}
关于c# - 使用 User32.ChangeDisplaySettings 设置分辨率仅在最大分辨率 ('badmode' 错误时失败),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9756416/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!