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:无法最大化模糊窗口的主要内容,如果未能解决你的问题,请参考以下文章