Отключить кнопку «Закрыть» в строке заголовка windows WPF (C #)

Я хотел бы знать, как отключить (не удалять / скрывать) кнопку «Закрыть» в окне WPF. Я знаю, как скрыть его, что делает заголовок windows windows выглядеть следующим образом:

введите описание изображения здесь

Но я хочу отключить его, чтобы он выглядел так:

введите описание изображения здесь

Я пишу сценарии на C # и используя WPF (Windows Presentation Foundation).

Попробуй это:

public partial class MainWindow : Window { [DllImport("user32.dll")] static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); [DllImport("user32.dll")] static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable); const uint MF_BYCOMMAND = 0x00000000; const uint MF_GRAYED = 0x00000001; const uint MF_ENABLED = 0x00000000; const uint SC_CLOSE = 0xF060; const int WM_SHOWWINDOW = 0x00000018; const int WM_CLOSE = 0x10; public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { } protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource; if (hwndSource != null) { hwndSource.AddHook(new HwndSourceHook(this.hwndSourceHook)); } } IntPtr hwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_SHOWWINDOW) { IntPtr hMenu = GetSystemMenu(hwnd, false); if (hMenu != IntPtr.Zero) { EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); } } else if (msg == WM_CLOSE) { handled = true; } return IntPtr.Zero; } } 

(Взято отсюда: http://blogs.microsoft.co.il/blogs/tamir/archive/2007/09/26/never-ever-close-me-how-to-disable-close-button-in-wpf .aspx )

убедитесь, что для параметра ResizeMode установлено ResizeMode NoResize .

Вы должны переопределить и в OnCLosing установить событие e.cancel = true

 public MyWindow() { InitializeComponent(); this.Closing += new System.ComponentModel.CancelEventHandler(MyWindow_Closing); } void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = true; } 

Вероятно, вы можете сделать это с помощью хакера Win32.

Я сделал это так: получите CustomChromeWindow (который в конечном итоге будет выглядеть точно так же, как на картинке), и просто привяжите свойство Command () к viewmodel, а затем установите CanExecuteCommand = false, что приведет к отключению кнопки ( как один ” отключить “кнопку в WPF с использованием шаблона MVVM? ).

Возможно, так и я: как отключить кнопку закрытия в окне в другом процессе с помощью C ++?

В принципе, вызовите этот код с помощью pInvoke. Вы можете легко получить дескриптор windows WPF.

Этот пост, который отвечает с помощью Behavior , GetWindowLong и SetWindowLong :

 public class HideCloseButtonOnWindow : System.Windows.Interactivity.Behavior { #region bunch of native methods 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); #endregion protected override void OnAttached() { base.OnAttached(); AssociatedObject.Loaded += OnLoaded; } protected override void OnDetaching() { AssociatedObject.Loaded -= OnLoaded; base.OnDetaching(); } private void OnLoaded(object sender, RoutedEventArgs e) { var hwnd = new System.Windows.Interop.WindowInteropHelper(AssociatedObject).Handle; SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU); } } 

Как это использовать: