[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 win32
, int
, private
, 句柄
, handle
, 窗口
, windowform
, charset
#windowform
wpf 按钮禁用样式、wpf 按钮禁用、wpf 按钮关闭当前窗口、wpf 按钮打开新窗口、wpf 窗口关闭按钮,以便于您获取更多的相关知识。

时间: 2024-11-08 19:07:53

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

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

点击窗口左上角图标时弹出来的菜单也就是这里所说的系统菜单(SystemMenu),有时需要禁用(移除)其中的某些或全部菜单项.刚才也有网友问到了这一点,OK,贴代码: 要全部禁用(移除)菜单项请调用SystemMenuManager.RemoveWindowSystemMenu(Window window)方法,想部分禁用(移除)菜单项则调用SystemMenuManager.RemoveWindowSystemMenuItem(Window window, int itemIndex)方法.

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

项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于Window自身的,但每个弹出框的外边框都是一样的.对其中一个窗口而言,我们要取消其Window边框,并在右上角摆上三个按钮并编写其点击事件等,但若每个弹出窗口都按照这种方式做一遍就太土了.我们想避免重复劳动,最自然的联想到了"继承".但WPF给我们找了若干麻烦,被挫败了几次.今天经过2小时的奋战,终于搞定了,分享一下. 挫败1,继承时编译错误 假设我们写好的父窗口类为BaseWindow,对应B

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

现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我们将子窗口按照ShowDialog()的方式显示出来的时候,很明显该窗口是模式化的(即主窗口等待该窗口的返回,主窗口将不相应用户输入),但如果此时将子窗口的Visibility设置成Visibility.Hidden来隐藏窗口,然后再将Visibility设置成Visibility.Visible来再次显示子窗口,此后子窗口便是非模式的了(即主窗口和子窗口一样相应用户输入) 案例: 当用户不操作软件达到一定的时间间隔后,软件会隐藏

[WPF疑难]Hide me! not close

有朋友遇到这样的一个问题,在WPF中,当Closing一个窗体时,将e.Cancel=true,然后再调用Hide()方法,以便隐藏窗口而不是关闭,但报异常了:"当Window Closing时不能设置Visibility,或调用Show(),Close(),Hide()方法".OK,本随笔将帮你解决该问题. 问题的关键在于不能再Closing方法中调用Close等,那么只要我们知道用户有意图关闭窗体时,仅仅再Closing方法中取消关闭,然后在Closing紧接着的某个方法中调用Hi

Win8系统禁用电脑上Power键怎么设置

  Win8系统禁用电脑上Power键怎么设置 一.先打开Win8控制面板,在Win8系统控制面板上选择"硬件和声音"-"更改电源按钮",随之就可以查看到电源管理的设置界面. 二.点击电源按钮设置项,即会发现这边有关机.睡眠.不采取任何动作三个选项.在这边我们直接选择"不采取任何操作". 如果你也想禁用Win8系统电脑上Power键,可以按照以上的步骤操作,这样一来在Win8正在运行的状态下,按Power键就不会有任何操作,我们可以通过鼠标操作来

利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域

 这篇文章主要介绍了利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域.需要的朋友可以过来参考下,希望对大家有所帮助 原理就是循环获取网页上的控件,然后设置disabled 属性为true.   代码如下:   代码如下: <script type="text/javascript">     var nodeList = document.getElementsByTagName("input");     for (var i =

windows编程 在一个窗口上加载一个位图图片

问题描述 windows编程 在一个窗口上加载一个位图图片 希望前辈们能给个demo程序.或者最基本的窗口上加载一个位图图片就好,加载位图时用的LoadImage 初学windows编程,不太懂上下文设备,希望大神能给个例程,让我学习. 解决方案 c++windows编程加载图片 解决方案二: #include #include "resource.h" LRESULT CALLBACK WndProc1(HWND hwnd,UINT message,WPARAM wParam,LPA

wpf-初学者求教,WPF软件在其他电脑上出现CLR20r3

问题描述 初学者求教,WPF软件在其他电脑上出现CLR20r3 用WPF写了个小软件,其中有从网上找来的UI代码.用InstallShield打包后(也打包了 .net4.0环境),放到虚拟机上运行,出现以下错误. 问题签名: 问题事件名称: CLR20r3 问题签名 01: dazzleui2.demo.exe 问题签名 02: 1.0.0.0 问题签名 03: 5565a796 问题签名 04: PresentationFramework 问题签名 05: 4.0.0.0 问题签名 06:

mfc-MFC父窗口上动态创建对话框出错

问题描述 MFC父窗口上动态创建对话框出错 m_dlgFlash=new CMyPlayerDlg();m_dlgFlash->Create(IDD_MYPLAYER_DLGthis); 解决方案 if (!m_wndView.Create(NULL NULL /*AFX_WS_DEFAULT_VIEW*/WS_CHILD | WS_VISIBLE CRect(0 0 0 0) this AFX_IDW_PANE_FIRST NULL)){ TRACE0(""未能创建视图窗口n&