How do I lock a WPF window so it can not be moved, resized,minimized, maximized or dragged
我正在寻找一种锁定WPF窗口的简单方法。 我可以在WPF窗口上设置一个简单的窗口样式或属性来锁定该窗口吗?
锁定是指用户无法移动,调整大小,拖动,最小化或最大化窗口。
使用以下方法设置窗口:
1 2 | window.WindowStyle = WindowStyle.None; window.ResizeMode = ResizeMode.NoResize; |
这将防止用户最小化,最大化或移动窗口。
为防止移动窗口或调整窗口大小,请在
可以将其与
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | using static NativeMethods; public class WindowPos : DependencyObject { public static bool GetIsLocked(DependencyObject obj) { return (bool)obj.GetValue(IsLockedProperty); } public static void SetIsLocked(DependencyObject obj, bool value) { obj.SetValue(IsLockedProperty, value); } public static readonly DependencyProperty IsLockedProperty = DependencyProperty.RegisterAttached("IsLocked", typeof(bool), typeof(WindowPos), new PropertyMetadata(false, IsLocked_Changed)); private static void IsLocked_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) { var window = (Window)d; var isHooked = d.GetValue(IsHookedProperty) != null; if (!isHooked) { var hook = new WindowLockHook(window); d.SetValue(IsHookedProperty, hook); } } private static readonly DependencyProperty IsHookedProperty = DependencyProperty.RegisterAttached("IsHooked", typeof(WindowLockHook), typeof(WindowPos), new PropertyMetadata(null)); private class WindowLockHook { private readonly Window Window; public WindowLockHook(Window window) { this.Window = window; var source = PresentationSource.FromVisual(window) as HwndSource; if (source == null) { // If there is no hWnd, we need to wait until there is window.SourceInitialized += Window_SourceInitialized; } else { source.AddHook(WndProc); } } private void Window_SourceInitialized(object sender, EventArgs e) { var source = (HwndSource)PresentationSource.FromVisual(Window); source.AddHook(WndProc); } public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_WINDOWPOSCHANGING && GetIsLocked(Window)) { var wp = Marshal.PtrToStructure<WINDOWPOS>(lParam); wp.flags |= SWP_NOMOVE | SWP_NOSIZE; Marshal.StructureToPtr(wp, lParam, false); } return IntPtr.Zero; } } } internal static class NativeMethods { [StructLayout(LayoutKind.Sequential)] public struct RECT { public int left; public int top; public int right; public int bottom; } [StructLayout(LayoutKind.Sequential)] public struct WINDOWPOS { public IntPtr hwnd; public IntPtr hwndInsertAfter; public int x; public int y; public int cx; public int cy; public int flags; } public const int SWP_NOMOVE = 0x0002, SWP_NOSIZE = 0x0001; public const int WM_WINDOWPOSCHANGING = 0x0046; } |
使用示例: