WinForms:无法最大化模糊窗口

Posted

技术标签:

【中文标题】WinForms:无法最大化模糊窗口【英文标题】:WinForms : Not able to Maximize Blurred Window 【发布时间】:2022-01-12 10:09:21 【问题描述】:

我有一个运行一些模糊效果的窗口。我希望这个窗口最大化,所以我在设计器中将Window State 字段设置为Maximized。但是窗口是未最大化并在左上角留下一些未覆盖的区域。我尝试了多个 Start Position 设置,但都没有解决问题。设置 窗户

模糊窗口的代码

using System.Runtime.InteropServices;

namespace WF4

    public partial class Form1 : Form
    
        public Form1()
        
            this.EnableBlur();
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            BackColor = Color.LimeGreen;
            TransparencyKey = Color.LimeGreen;
            InitializeComponent();
            FormBorderStyle = FormBorderStyle.None;
        

        private void Form1_Load(object sender, EventArgs e)
        

        

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        
            if (e.KeyCode == Keys.Enter)
            
                MessageBox.Show("Hllo");
            
        

    
    public static class WindowExtension
    
        [DllImport("user32.dll")]
        static internal extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data);

        public static void EnableBlur(this Form @this)
        
            var accent = new AccentPolicy();
            accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND;
            var accentStructSize = Marshal.SizeOf(accent);
            var accentPtr = Marshal.AllocHGlobal(accentStructSize);
            Marshal.StructureToPtr(accent, accentPtr, false);
            var Data = new WindowCompositionAttributeData();
            Data.Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY;
            Data.SizeOfData = accentStructSize;
            Data.Data = accentPtr;
            SetWindowCompositionAttribute(@this.Handle, ref Data);
            Marshal.FreeHGlobal(accentPtr);
        

    
    enum AccentState
    
        ACCENT_DISABLED = 0,
        ACCENT_ENABLE_GRADIENT = 1,
        ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
        ACCENT_ENABLE_BLURBEHIND = 3,
        ACCENT_INVALID_STATE = 4
    

    struct AccentPolicy
    
        public AccentState AccentState;
        public int AccentFlags;
        public int GradientColor;
        public int AnimationId;
    

    struct WindowCompositionAttributeData
    
        public WindowCompositionAttribute Attribute;
        public IntPtr Data;
        public int SizeOfData;
    

    enum WindowCompositionAttribute
    
        WCA_ACCENT_POLICY = 19
    


【问题讨论】:

确保您的应用程序是 DpiAware 并且表单缩放到 Dpi。 -- 无边框表单仍然有边框(7+1 像素),因此在定位该窗口时请考虑这一点。您可以使用当前屏幕工作区域作为度量(因为您的应用程序将是 DpiAware,您将能够读取非虚拟化值)并相应地定位您的表单——此处的注释可能会有所帮助:Using SetWindowPos with multiple monitors 这就是使用未记录的 winapi 函数时的痛苦。尝试通过将 FormBorderStyle 属性设置为 None 并在 InitializeComponent() 之后调用 EnableBlur() 来取得成功。 【参考方案1】:

我测试了 Hans 的建议,效果很好。

解决方法是将 FormBorderStyle 属性设置为 None。

确保背景颜色为 Control。

InitializeComponent()后调用EnableBlur():

InitializeComponent();
this.EnableBlur();

输出:

【讨论】:

我已经做出了回答。如果您不介意,可以点击“✔”将我的回复标记为已接受答案。它还将帮助其他人解决类似的问题。

以上是关于WinForms:无法最大化模糊窗口的主要内容,如果未能解决你的问题,请参考以下文章

Winforms:在对话框外单击时关闭模式对话框

如何在每个使用桌面分辨率的右下角放置一个窗口(Winforms)

使用 winappdriver 最大化桌面窗口无法正常工作

WPF 使用触发器让窗口无法最大化且同时可以调整窗口大小

python selenium无法最大化窗口

解决Mac下窗口无法最大化的问题 - 只有最小化和全屏怎么够