禁用WPF窗口标题栏中的关闭按钮(C#)

Bub*_*d86 16 c# wpf

我想知道如何禁用(不删除/隐藏)WPF窗口中的关闭按钮.我知道如何隐藏它使窗口的标题栏看起来像这样:

在此输入图像描述

但我想禁用它意味着它应该是这样的:

在此输入图像描述

我在C#中编写脚本并使用WPF(Windows Presentation Foundation).

Yoa*_*oav 22

试试这个:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

(摘自:http://blogs.microsoft.co.il/blogs/tamir/archive/2007/09/26/never-ever-close-me-how-to-disable-close-button-in-wpf .aspx)

确保你设置ResizeModeNoResize.

  • 我建议'else if(msg == WM_CLOSE){handling = true; 省略了'',因为这会阻止窗口以编程方式关闭. (2认同)