我在C#中有一个表单应用程序.当我更改显示器的DPI时,所有控件都会移动.我使用了代码this.AutoScaleMode = AutoScaleMode.Dpi,但它没有避免这个问题.
有没有人有想法?
我想要一个相对无黑客的方式来做这个,任何想法?例如,以下截图不包括半透明窗口:
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
Text = "Opaque Window"
Dim win2 As New Form
win2.Opacity = 0.5
win2.Text = "Tranparent Window"
win2.Show()
win2.Top = Top + 50
win2.Left = Left() + 50
Dim bounds As Rectangle = System.Windows.Forms.Screen.GetBounds(Point.Empty)
Using bmp As Bitmap = New Bitmap(bounds.Width, bounds.Height)
Using g As Graphics = Graphics.FromImage(bmp)
g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size)
End Using
bmp.Save("c:\temp\scn.gif")
End Using
Process.Start(New Diagnostics.ProcessStartInfo("c:\temp\scn.gif") With {.UseShellExecute = True})
End Sub
End …Run Code Online (Sandbox Code Playgroud) 我已经好好Screen.PrimaryScreen.Bounds.Size待了一段时间,但在连接到我的大屏幕电视的Windows7电脑上,它给了我不正确的价值.
我在其他地方读过尝试,SystemInformation.PrimaryMonitorSize但是给出了相同的值.
当我右键单击桌面以获得屏幕分辨率时,它说1920x1080.以上两个给了我1280x720.
我也试过WPF版本:
var w = System.Windows.SystemParameters.PrimaryScreenWidth;
var h = System.Windows.SystemParameters.PrimaryScreenHeight;
MessageBox.Show(new Size((int)w, (int)h).ToString());
Run Code Online (Sandbox Code Playgroud)
显示尺寸已通过(右键单击桌面)Personalize > Desktop选项更改为150%(因为屏幕为60"并且您坐得很远).
如何检测这个,以便从上面返回的值可以调整?
注意:我已经发现如何通过右键单击可执行文件来解决这个问题并调整兼容性以禁用DPI虚拟化,但我仍然需要一个编程解决方案,所以我不必让用户自己调整它:请参阅 - http: //msdn.microsoft.com/en-us/library/dd464660(VS.85).aspx#dpi_virtualization
将"更改所有项目的大小"滑块设置Control Panel\Appearance and Personalization\Display为较大(更改此注册表项HKEY_CURRENT_USER\Control Panel\Desktop\DesktopDPIOverride:) :导致Control.PointToScreen()方法错误计算.这可以使用Windows窗体中的以下Class1重现:
public class Class1 : Control
{
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Draw(e.ClipRectangle, e.Graphics);
}
private void Draw(Rectangle rect, Graphics graphics)
{
Pen pen = new Pen(Color.Red);
pen.Width = 2;
graphics.DrawRectangle(pen, rect);
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
Point p = this.PointToScreen(new Point(0, 0));
ControlPaint.DrawReversibleFrame(new Rectangle(p, new Size(e.X, e.Y)), Color.Yellow, FrameStyle.Dashed);
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
this.Invalidate();
}
}
Run Code Online (Sandbox Code Playgroud)
在WinForm中使用此控件并单击它可以按预期工作.现在将"更改所有项目的大小"更改为"更大"并再次运行代码 - 代码不再按预期运行,PointToScreen方法返回(0,0)的错误值.
有人知道如何解决这个问题吗?非常感谢.

我的应用程序在100%DPI设置下看起来很好,但是当用户选择不同的(125%或150%)单词时,不适合容器.我尝试用我在这里找到的解决方案解决这个问题:检测Windows字体大小(100%,125%,150%),这是:
this.AutoScaleMode = AutoScaleMode.Dpi;
Run Code Online (Sandbox Code Playgroud)
它固定了150%的设置(使它有点模糊,但没关系),不幸的是它没有使用125%,这是在应用程序打算运行的PC上使用.
是否有一些简单的解决方法,或者我必须手动重新排列每个表单?
我们在WinForm(CefSharp控件)中有一个控件,当用户屏幕在Windows上设置为125%时,它会受到图形工件的影响.它不仅仅是控制,独立Chrome在某种程度上做到了.我们能够修复工件的唯一方法是更改下图所示的exe设置.有没有办法在代码中更改它?
编辑:这不是重复.制作应用程序DPI意识与DPI缩放不一样
所以我们有这个奇怪的问题.我们的应用程序是一个C#/ WinForms应用程序.在我们的6.0版本中,我们的应用程序不支持DPI.在我们的6.1版本中,它突然变成了DPI意识.
在6.0版本中,如果您在高DPI中运行它,它使用Windows位图缩放,这很好,因为这不会影响屏幕布局.在6.1版本中,由于它因某种原因而成为DPI识别,因此用户界面受到严重破坏.
我们现在无法解决这个问题.我们有数百个屏幕,因此在DPI识别模式下使它们全部正常工作将花费大量时间.
我们已使用SysInternals Process Explorer确认了这一点.在我们的6.0版本中,它显示了Unaware,但在我们的6.1版本中,它最初显示Unaware,但随后更改为System Aware.
后者发生在代码从EXE进入包含所有用户界面代码的程序集DLL中时(我们的EXE基本上是一个非常薄的shell;它实际上只是在我们的表示层程序集上调用一个Controller类.)
我们已确认以下内容:
我们不明白为什么我们的6.1版本突然变成了DPI意识.我们无知还有什么可以看,我们需要一个修复程序,将此版本恢复到DPI unaware模式.它正在阻止我们的发布.非常感谢任何指针.我们愿意在这一点上尝试任何事情.
升级到赢得10后我的vs 2013表格在运行时显得模糊,并且风格与2013年在设计模式下拍摄时不同.
尝试安装vs 2015和模糊效果仍然是相同的
编辑 - 这里
我正在添加图片以帮助澄清.还有许多其他变化,例如消除3d按钮
当我打开我的主窗体设计窗口(VS2010中的C#文件)时,关联的资源文件会自动修改,有时它是位置,有时它是图像的数据或只是代码的顺序被重新排列.一切仍然编译和工作正常,我只需要记住要恢复这些更改,否则我会不断地向我的存储库提出乱码.有人知道为什么会这样,也许是因为某些组件?
编辑:
例如,这个数据:
<data name="connectToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
somevalue
</value>
Run Code Online (Sandbox Code Playgroud)
获取自动更改为:
<data name="connectToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
someothervalue
</value>
Run Code Online (Sandbox Code Playgroud)
并放在一个不同的地方.一切仍然正常,问题是这些更改显示在我的源代码控制中,所以我必须记得在我提交之前还原resx文件,除非我实际上对文件做了一些修改,然后我必须提交所有内容.
我正在Visual Studio 2010上使用C#开发Windows窗体应用程序。我发现如果我使用高dpi显示设置,则会缩放此应用程序。但是,如果我通过在Windows资源管理器上单击鼠标右键菜单来激活文件属性“在高dpi设置上禁用显示缩放”,则似乎无法缩放。
有没有办法在Visual Studion 2010 C#或更高版本上以编程方式激活“在高dpi设置上禁用显示比例缩放”?
我尝试设置应用程序清单文件,但尚未成功设置。