如何使用c#和WinForm创建一个1像素宽的窗口

本文关键字:一个 1像素 窗口 何使用 WinForm 创建 | 更新日期: 2023-09-27 18:16:45

我想创建一个应用程序,有一个小窗口显示在桌面的底部角落。在启动时,窗口应该非常小,理想情况下,宽度只有几个像素。

下面是我用来做这件事的代码:

public partial class DurationT64 : Form
{
    private Size fullSize;
    private Point fullPos;
    private Point compactPos;
    public DurationT64()
    {
        InitializeComponent();
        var workingArea = Screen.PrimaryScreen.WorkingArea;
        this.MinimumSize = new Size(0, this.Height);
        this.MaximumSize = new Size(this.Width, this.Height);
        // fullPos: the window location when it is in full size form.
        fullPos = new Point(workingArea.Right - this.Width, workingArea.Bottom - this.Height);
        this.Location = fullPos;
        // fullSize: the size of the windown when it is in full size form.
        fullSize = new Size(this.Width, this.Height);
        this.Size = fullSize;
        // compactPos: the window location when it is in compact size form.
        compactPos = new Point(workingArea.Right - 30, fullPos.Y);
        this.Width = 1;
        this.Location = compactPos;
    }
}

正如您在本例中看到的,我打算创建一个宽度仅为1像素的窗口,靠近主显示器的右边缘。

然而,我意识到窗口并不像我预期的那么小。它的宽度下降到20像素,但不会小于这个。请参考下面的屏幕截图:图片显示窗口比预期的要宽

我对这个问题做了一些研究,并注意到扎克·约翰逊(@zach-johnson)早在2009年就提出了一个解决方案。克服操作系统强加的Windows最小尺寸限制。

然而,该链接中提出的两种方法(Zach提出的拦截WM_消息和@Ace提出的SetBoundsCore)都适用于我。

谁能给我一些解决这个问题的方法?最好是一个纯粹基于c#/Winform的解决方案,如果可能的话,不依赖于本地Win32窗口消息循环。

多谢!

如何使用c#和WinForm创建一个1像素宽的窗口

这是相当直接的,Winforms确保窗口不能小于系统规定的最小窗口大小,暴露为SystemInformation。MinWindowTrackSize属性。这是一个"安全"设置,它确保用户在调整窗口大小时不会使窗口太小,从而失去对它的控制。同样的考虑也适用于代码

绕过这个限制不需要魔法,您需要做两件事:

  • 设置FormBorderStyle属性为None,这样用户就不能调整窗口的大小。
  • 在创建窗口后设置的大小。Load事件是最好的。

关于你现有代码的一些注释:小心修改Width/Height/Size属性,你在构造函数中做了太多,它不能正常工作。在构造函数中,它们还不匹配窗口的实际大小。在具有高分辨率显示器的现代机器上,自动缩放以匹配视频适配器的DPI在今天很重要。您必须推迟,直到创建窗口并完成缩放,Load事件是执行此类代码的合适位置。使用Load.

的少数几个原因之一

并且注意你的Location属性计算是不充分的,它没有考虑任务栏的位置。在我的机器上不能用,我喜欢右边的任务栏。

最低再生产:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.FormBorderStyle = FormBorderStyle.None;
    }
    protected override void OnLoad(EventArgs e) {
        this.Width = 1;
        base.OnLoad(e);
    }
}

请记住,你需要鹰眼才能在屏幕上找到它:)