GE:Imagination at work

[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

posted on 2008-06-12 19:03 周银辉 阅读(2069) 评论(6)  编辑 收藏 所属分类: .NetWPF

评论

#1楼  2008-06-12 22:50 曲滨*銘龘鶽      

int handle = new WindowInteropHelper(window).Handle.ToInt32(); 来取得句柄,
是重点,其他方法是通用的;正常 winform 也这样关闭
不过禁止不了 alt+F4 需要另写代码处理;   回复  引用  查看    

#2楼  2008-06-12 23:39 Microshaoft      

override wndproc 方法
拦截wm_close 消息,return出去即可

下面的例子可以直接将其他进程的窗口的"最小化"禁用变灰
http://www.codeproject.com/KB/dialog/CWindow.aspx

http://www.codeproject.com/KB/dotnet/wfspy.aspx   回复  引用  查看    

#3楼 [楼主] 2008-06-13 01:47 周银辉      

@Microshaoft
Thanks :)   回复  引用  查看    

#4楼  2008-06-13 12:45 CowNew开源团队      

写WPf经常需要用Win32API,感觉很不爽   回复  引用  查看    

#5楼  2008-06-13 13:43 A.Z! [未注册用户]

--引用--------------------------------------------------
CowNew开源团队: 写WPf经常需要用Win32API,感觉很不爽
--------------------------------------------------------


那就不要写windows程序...

个人认为WPF的xaml schema设计的太怪异,WPF的设计器不够迅速,完全不人性化,太占用资源,最后编译出见不得人的x.g.cs文件,时在让我很失望。
运行起来效果是好的,但是会比非WPF寄宿的窗体要慢许多,大概我的笔记本显卡比较差,也没有用vista系统。   回复  引用    

#6楼  2008-06-15 12:49 曲滨*銘龘鶽      

wpf 是基于 dx 所有控件不是标准的win控件。
而且刚刚出一个版本,慢也是正常的。   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接:
 

导航

公告

<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

统计

搜索

 

常用链接

留言簿(83)

我参加的小组

我参与的团队

随笔分类(188)

随笔档案(174)

友情链接

积分与排名

最新随笔

阅读排行榜