为什么最大化/最小化事件导致关闭按钮在禁用后重新启用?

Bra*_*ick 2 .net c# forms pinvoke winapi

我使用P/Invoke调用GetSystemMenu和EnableMenuItem(win32api)来禁用关闭功能.但是,在最小化或最大化我的Windows窗体应用程序后,将重新启用该按钮.

显然,最小化或最大化会导致行为,但如何?我不知道在哪里可以防止这种行为.

我应该阻止最大化和最小化行为,还是IP /调用呼叫的方式有什么特别的错误?加载应用程序(主窗体)后,我会通过单击按钮调用静态方法.

class PInvoke
{
    // P/Invoke signatures
    [DllImport("user32.dll")]
    static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
    [DllImport("user32.dll")]
    static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);

    // SysCommand (WM_SYSCOMMAND) constant
    internal const UInt32 SC_CLOSE = 0xF060;

    // Constants used with Add/Check/EnableMenuItem
    internal const UInt32 MF_BYCOMMAND = 0x00000000;
    internal const UInt32 MF_ENABLED = 0x00000000;
    internal const UInt32 MF_GRAYED = 0x00000001;
    internal const UInt32 MF_DISABLED = 0x00000002;

    /// <summary>
    /// Sets the state of the Close (X) button and the System Menu close functionality.
    /// </summary>
    /// <param name="window">Window or Form</param>
    /// <param name="bEnabled">Enabled state</param>
    public static void EnableCloseButton(IWin32Window window, bool bEnabled)
    {
        IntPtr hSystemMenu = GetSystemMenu(window.Handle, false);

        EnableMenuItem(hSystemMenu, SC_CLOSE, MF_BYCOMMAND | (bEnabled ? MF_ENABLED : MF_GRAYED));
    }
}
Run Code Online (Sandbox Code Playgroud)

mdm*_*dma 5

每个窗口都有一个窗口类,它定义该类的所有窗口的样式.您可以使用CS_NOCLOSE类样式删除该类窗口的关闭按钮.有关如何设置此类标志的详细信息,请参见此处此处.

如果这不能满足您的需求,我不会为了可用性而禁用最小化/最大化,但您可以监听最小化/最大化事件并重新运行代码以禁用关闭按钮.最后,可以处理close事件,而不是关闭.然后你知道你的窗口肯定不会被关闭,即使关闭按钮无意中被启用了.