我正在 C# Winforms 应用程序中开发一个功能,它需要确定任务栏的 Windows“通知区域”的宽度(特别是当停靠在屏幕底部的默认位置时)。
为了提供更好的上下文,程序显示小的、瞬态的、无边界的窗口(类似于工具提示),我们希望确保通知区域“系统托盘”图标和时钟永远不会被这些窗口之一覆盖。
下面是我想要获得的宽度的屏幕截图(来自 Windows 10),以及它的用途:
到目前为止,我已经探索了 .Net 框架,并研究了 Win32 API 调用,但是我无法确定任何潜在的解决方案(也无法确定这是否确实可行)。
任何建议将不胜感激。理想情况下,解决方案最早可与 Windows 7 兼容,但这并不是绝对要求。
我打电话 GetClientRect在 C# 中通过 pinvoke以获取我用作 DirectX 渲染目标区域的面板的尺寸(在 WindowsForm 上)。我本以为 WinAPI 给了我未缩放的(即,无论 Windows 显示 DPI 设置如何,返回的值都应该相同)尺寸,但它似乎给了我缩放的尺寸(至少在 Windows 8.1 上,因为我还没有测试过)在其他操作系统上)。
该ClientRectangle属性还返回与 相同的缩放尺寸GetClientRect。当我将表单更改AutoScaleMode为none.
这是预期的行为GetClientRect吗?如果是这样,我如何获得未缩放的尺寸?
编辑:这仅影响 Windows 8.1。在 Windows 7 上对其进行了测试,GetClientRect 返回未缩放的尺寸!
自从我在 2015 年购买了这台带有 4k 显示屏的笔记本电脑以来,我就一直遇到这个问题。经过很多努力,我设法解决了这个问题,但我已经厌倦了。VS2017 应该是 DPI 感知的,因此在创建简单的 MDI 父表单并运行应用程序时,我不希望出现任何问题。但令我沮丧的是,toolStrip 中的图标(只是 MDI 父窗体中的标准图标)缩放得非常糟糕。当我创建一个带有按钮的表单时,该表单在 Visual Studio 2017 设计器中看起来很好,并且我运行应用程序并加载表单时,按钮文本未完全显示。我的显示设置如下:
我试图找到解决方案,但我能找到的唯一可行的方法是通过注册表将我的 Visual Studio 设计器设置为 dpi-unaware(链接在这里)
帮助任何人?
更新当我添加一个新的 MDI 表单并设置 DPI 感知关闭时,除了 Visual Studio 本身(模糊)之外,一切看起来都很好。
我在使导出的 C# 项目中的字体与设计器中的字体一样清晰时遇到了问题。当我设计它时,它看起来很完美,但是当我运行程序或导出它时,字体很模糊。
示例屏幕截图 #1

示例屏幕截图 #2

我试图只捕获桌面中的特定窗口,但是却得到了混合图像,窗口的一部分和桌面区域的一部分。
我想念什么?
这是我的代码:
RECT rect = new RECT();
if (!SetForegroundWindow(handle))
throw new Win32Exception(Marshal.GetLastWin32Error());
if (!GetWindowRect(handle, out rect))
throw new Win32Exception(Marshal.GetLastWin32Error());
Thread.Sleep(500);
Rectangle windowSize = rect.ToRectangle();
Bitmap target = new Bitmap(windowSize.Width, windowSize.Height);
using (Graphics g = Graphics.FromImage(target))
{
g.CopyFromScreen(0, 0, 0, 0, new Size(windowSize.Width, windowSize.Height));
}
target.Save("foo.png", System.Drawing.Imaging.ImageFormat.Png);
Run Code Online (Sandbox Code Playgroud) 这是非常奇怪的。我移植了一个在 VS2008 下运行良好的项目,但是当我用 VS2017 构建它时,一行的存在导致我的对话框调整大小 - 代码甚至不需要运行,它只需要出现在一个子例程中跑!我已经创建了我可以想出的最简单的程序版本来显示这种行为。尝试在不同版本的 Visual Studio 下构建/运行。我希望解释为什么会发生这种情况以及如何解决它。谢谢。
using System;
using System.IO;
using System.Windows.Forms;
using System.Windows.Media.Imaging; // Need reference to PresentationCore
namespace Test2017
{
public class MainDlg : Form
{
[STAThread]
static void Main() { Application.Run(new MainDlg()); }
public MainDlg()
{
SuspendLayout();
var button = new Button { Location = new System.Drawing.Point(7, 56), Size = new System.Drawing.Size(263, 23), Text = "Note size before and after clicking" };
button.Click += Button_Click;
ClientSize = new System.Drawing.Size(282, 253);
Controls.Add(button);
ResumeLayout(false);
PerformLayout(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 .NET Framework 编写一个控制台应用程序。我想截图我的屏幕。我已经使用过其他答案,如下所示:
问题是这并不能捕获我的整个屏幕。底部和右侧大约缺失 1/5。
如何使用 C# .NET Framework 捕获整个屏幕?
我试图在MSDN上找到答案,但是我不清楚它是如何工作的。我所有的工作都在Windows 8.1上进行。
这是我的问题。我正在使用具有3200x1800高分辨率显示器的笔记本电脑。我一直在使用EnumDisplayMonitors来获取屏幕的边框。
如果我的显示设置为默认设置,这似乎可以正常工作。但是我注意到,当我更改“窗口”显示设置以提供更大的文本时,EnumDisplayMonitor返回的分辨率也会改变。与其获得3200x1800,不如获得2133x1200。
我猜是因为我要求输入更大的文本,因此Windows选择将屏幕表示为较小的分辨率。
看来,如果我查看虚拟屏幕属性,则所有内容均以屏幕的实际坐标表示,即3200x1800。但是用于获取窗口和监视矩形的API似乎可以在此“其他”坐标空间上运行。
是否有任何文档/ Windows API来处理这些“其他坐标”和“虚拟坐标”之间的转换?即,如果我想让EnumDisplayMonitor或GetMonitorInfo给我真实的屏幕坐标,该如何将2133x1200转换为3200x1800?
我正在设计一个 Windows 窗体应用程序。我有一个以最大化状态加载的 MDIParent 窗体,并在最大化状态下加载其子窗体。但是,当我打开 OpenFileDialog 或任何 datareader 对象时,MDIParent 将缩小到较小的尺寸及其所有窗体和控件。
这个解决方案Opening child form 导致 mdiform 改变大小和收缩在我的情况下不适用/工作。
一些背景:我在几乎所有的 WinForm 应用程序中都看到了这种行为,但我从来没有热衷于解决它。当我开始调查时,我能够缩小到上面强调的原因。一些帖子将其描述为 Windows 错误,但只要屏幕分辨率开始超过 1024 (VS 2010),就我的情况而言,它一直存在。我希望它不仅仅是一个 Windows 错误...
c# ×6
winforms ×6
.net ×3
winapi ×2
windows ×2
coordinates ×1
dpi ×1
mdichild ×1
mdiparent ×1
pinvoke ×1
resolution ×1
vb.net ×1
windows-10 ×1