我正在编写一个 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
,窗口的大小都会调整。有人可以帮助我吗?任何建议都感激不尽。
现在的问题是~WS_SYSMENU和~WS_SIZEBOX不能同时有效。一旦我设置了 ~WS_SYSMENU,无论是否设置了 ~WS_SIZEBOX,窗口的大小都可以调整。
你是这样写代码的吗
GetWindowLong(hwnd, GWL_STYLE) & ~WS_SIZEBOX & ~WS_SYSMENU
这是错误的,应该是:
GetWindowLong(hwnd, GWL_STYLE) & ~(WS_SYSMENU | WS_SIZEBOX)