且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[WPF疑难]如何禁用窗口上的关闭按钮

更新时间:2022-05-24 02:54:29

原文 [WPF疑难]如何禁用窗口上的关闭按钮

[WPF疑难]如何禁用窗口上的关闭按钮
                                          周银辉

哈哈,主要是调用RemoveMenu这个API,所以没什么好说的,直接“干货”吧:

namespace VersatileMessageBoxLib
{
    using System;
    using System.Windows.Interop;
    using System.Runtime.InteropServices;

    public class CloseButton
    {
        [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        private static extern int GetSystemMenu(int hwnd, int revert);
        [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        private static extern int EnableMenuItem(int menu, int ideEnableItem, int enable);


        private const int SC_CLOSE = 0xF060;
        private const int MF_BYCOMMAND = 0x00000000;
        private const int MF_GRAYED = 0x00000001;
        private const int MF_ENABLED = 0x00000002;

        private CloseButton()
        {
        }

        public static void Disable(int handle)
        {
              // The return value specifies the previous state of the menu item
            // (it is either MF_ENABLED or MF_GRAYED). 0xFFFFFFFF indicates that
            // the menu item does not exist.
            switch (EnableMenuItem(GetSystemMenu(handle, 0), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED))
            {
                case MF_ENABLED:
                    break;
                case MF_GRAYED:
                    break;
                case -1:
                    throw new Exception("The Close menu item does not exist.");
                default:
                    break;
            }
        }

    }

    在使用时:调用CloseButton.Disable(int handle)方法将窗口句柄传进去就可以了,如果是WPF窗口的化,可以使用           int handle = new WindowInteropHelper(window).Handle.ToInt32(); 来取得句柄,WindowForms窗口的句柄是可以直接取得的。
另外,如果你想Cancel窗口的关闭而不是禁用该按钮,那么可以参考我的这篇文章[WPF疑难]Hide me! not close