程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> [WPF疑難]如何禁用窗口上的關閉按鈕

[WPF疑難]如何禁用窗口上的關閉按鈕

編輯:關於.NET

哈哈,主要是調用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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved