原文 [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

[WPF疑难]如何禁用窗口上的关闭按钮的更多相关文章

  1. [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu)

    原文 [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu) [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu) 周银辉 点击窗口左上角图标时弹出来的菜单也就是这里所说的系 ...

  2. [WPF疑难] 继承自定义窗口

    原文 [WPF疑难] 继承自定义窗口 [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于Window自身的,但每个弹出框 ...

  3. 重写MFC窗口上的关闭按钮事件(SDI, MDI, Dialog)

    This piece of code demonstrate how to override WM_CLOSE event. 点击窗口关闭按钮,触发相关事件! 有时候,在MFC程序退出之前,我们通常会 ...

  4. [WPF疑难]避免窗口最大化时遮盖任务栏

    原文 [WPF疑难]避免窗口最大化时遮盖任务栏 [WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是:如果窗口的WindowStyle被直接或间接地设置为None后( ...

  5. 【WPF】在新线程上打开窗口

    当WPF应用程序运行时,默认会创建一个UI主线程(因为至少需要一个),并在该UI线程上启动消息循环.直到消息循环结束,应用程序就随即退出.那么,问题就来了,能不能创建新线程,然后在新线程上打开一个新窗 ...

  6. [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

    原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...

  7. [WPF疑难]Hide me! not close

    原文 [WPF疑难]Hide me! not close [WPF疑难]Hide me! not close                               周银辉 有朋友遇到这样的一个问 ...

  8. 【.net 深呼吸】WPF 中的父子窗口

    与 WinForm 不同,WPF 并没有 MDI 窗口,但 WPF 的窗口之间是可以存在“父子”关系的. 我们会发现,Window 类公开了一个属性叫 Owner,这个属性是可读可写的,从名字上我们也 ...

  9. WPF中在摄像头视频上叠加控件的解决方案

    一.视频呈现 前段时间,在一个wpf的项目中需要实时显示ip摄像头,对此的解决方案想必大家都应该知道很多.在winform中,我们可以将一个控件(一般用panel或者pictruebox)的句柄丢给摄 ...

随机推荐

  1. 用DBMS_ADVISOR.SQLACCESS_ADVISOR创建SQL Access Advisor访问优化建议

    使用OEM方式来创建SQL Access Advisor访问优化建议,已经是四五年的事了,下面就来写写怎样使用DBMS_ADVISOR.SQLACCESS_ADVISOR来创建SQL Access A ...

  2. Git怎样同一时候删除多个仓下的同一个分支

    每次下载完代码我们都会在本地通过repo start my_local --all建立分支,这样我们下载的代码在每一个仓下都有一个名叫my_local的分支,有些时候我们因为须要还会建立其它分支,当我 ...

  3. nhibernate 更新 SqlDateTime 溢出问题

    最近在用nhibernate,更新实体 时遇到一个SqlDateTime 溢出问题 费力调了N久,开始以为是实体的日期格式属性未赋值,但是调试发现哪怕实体对应的日期类型属性赋值了,也会报同样的错误. ...

  4. ZOJ3689 Digging(01背包)

    #include <iostream> #include <cstdio> #include<cmath> #include<algorithm> #i ...

  5. Android核心基础

    第三代移动通讯技术(3rd Generation) ,支持高速数据传输的蜂窝移动通讯技术.3G与2G的主要区别是传输数据的速度. 1987年,第一台模拟制式手机(1G)问世,只能进行语音通话,型号:摩 ...

  6. (转)openURL的使用方法

    view plaincopy to clipboardprint? [[UIApplication sharedApplication] openURL:[NSURL URLWithString:ap ...

  7. Shader程序中内置的状态变量

    经常在着色器程序需要访问一些全局状态,像当前的 model view projection 矩阵,当前环境的颜色诸如此类. 内置的矩阵 UNITY_MATRIX_MVP:当前模型 视窗 投影矩阵 UN ...

  8. maven copy 依赖jar包

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-depen ...

  9. 5.6.1 Boolean类型

    Boolean类型是与布尔值对应的引用类型.要创建Boolean对象,可以像下面这样调用Boolean构造函数并传入true或false值. var booleanObject=new Boolean ...

  10. Java 比较两日期相差天数

    (版本1) publicstaticint getIntervalDays(Date fDate, Date oDate) { if (null == fDate || null == oDate) ...