如何在 WPF 窗口中隐藏关闭按钮并禁用调整大小?

问题描述 投票:0回答:1

我正在编写一个 wpf 窗口,它有一个自定义的最小化按钮和关闭按钮,而不是默认的按钮,同时它不应该调整大小。只需设置

WindowStyle=None
ResizeMode=NoResize
就可以了,但我希望其他默认窗口行为也能保留(例如阴影、动画、角半径等..)

经过多次搜索我发现了这个P/Invoke方法

private const int GWL_STYLE = -16;
private const int WS_SYSMENU = 0x80000;
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

然后

var hwnd = new WindowInteropHelper(this).Handle;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);

它对我来说效果很好,使用下面的代码可以禁用窗口大小调整。

private const int WS_SIZEBOX = 0x00040000;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SIZEBOX);

现在的问题是

~WS_SYSMENU
~WS_SIZEBOX
不能同时有效。一旦我设置了
~WS_SYSMENU
,无论是否设置过
~WS_SIZEBOX
,窗口的大小都会调整。有人可以帮助我吗?任何建议都感激不尽。

c# wpf pinvoke setwindowlong
1个回答
0
投票

现在的问题是~WS_SYSMENU和~WS_SIZEBOX不能同时有效。一旦我设置了 ~WS_SYSMENU,无论是否设置了 ~WS_SIZEBOX,窗口的大小都可以调整。

你是这样写代码的吗

GetWindowLong(hwnd, GWL_STYLE) & ~WS_SIZEBOX & ~WS_SYSMENU

这是错误的,应该是:

GetWindowLong(hwnd, GWL_STYLE) & ~(WS_SYSMENU | WS_SIZEBOX)
© www.soinside.com 2019 - 2024. All rights reserved.