zoukankan      html  css  js  c++  java
  • [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu)

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

                                          周银辉

     点击窗口左上角图标时弹出来的菜单也就是这里所说的系统菜单(SystemMenu),有时需要禁用(移除)其中的某些或全部菜单项。刚才也有网友问到了这一点,OK,贴代码:

    要全部禁用(移除)菜单项请调用SystemMenuManager.RemoveWindowSystemMenu(Window window)方法,想部分禁用(移除)菜单项则调用SystemMenuManager.RemoveWindowSystemMenuItem(Window window, int itemIndex)方法。
    值得注意的是禁用了其中的菜单项那么与之相关联的功能也会被禁用,比如将“关闭”从其中移除,那么窗口的右上角的关闭按钮也会被禁用,在任务栏的窗口图标上右击也不会出现相应的项目

    public static class SystemMenuManager
        {
            [DllImport("user32.dll", EntryPoint = "GetSystemMenu")]
            private static extern IntPtr GetSystemMenu(IntPtr hwnd, int revert);

            [DllImport("user32.dll", EntryPoint = "GetMenuItemCount")]
            private static extern int GetMenuItemCount(IntPtr hmenu);

            [DllImport("user32.dll", EntryPoint = "RemoveMenu")]
            private static extern int RemoveMenu(IntPtr hmenu, int npos, int wflags);

            [DllImport("user32.dll", EntryPoint = "DrawMenuBar")]
            private static extern int DrawMenuBar(IntPtr hwnd);

            private const int MF_BYPOSITION = 0x0400;
            private const int MF_DISABLED = 0x0002;

            public static void RemoveWindowSystemMenu(Window window)
            {
                if(window == null)
                {
                    return;
                }

                window.SourceInitialized += window_SourceInitialized;

            }

            static void window_SourceInitialized(object sender, EventArgs e)
            {
                var window = (Window) sender;

                var helper = new WindowInteropHelper(window);
                IntPtr windowHandle = helper.Handle; //Get the handle of this window
                IntPtr hmenu = GetSystemMenu(windowHandle, 0);
                int cnt = GetMenuItemCount(hmenu);

                for (int i = cnt - 1; i >= 0; i--)
                {
                    RemoveMenu(hmenu, i, MF_DISABLED | MF_BYPOSITION);
                }
            }

            public static void RemoveWindowSystemMenuItem(Window window, int itemIndex)
            {
                if (window == null)
                {
                    return;
                }

                window.SourceInitialized += delegate
                                                {
                                                    var helper = new WindowInteropHelper(window);
                                                    IntPtr windowHandle = helper.Handle; //Get the handle of this window
                                                    IntPtr hmenu = GetSystemMenu(windowHandle, 0);

                                                    //remove the menu item
                                                    RemoveMenu(hmenu, itemIndex, MF_DISABLED | MF_BYPOSITION);

                                                    DrawMenuBar(windowHandle); //Redraw the menu bar
                                                };

               

            }
        }
  • 相关阅读:
    整数划分递归模板
    最近点对算法模板
    计算几何模板
    poj1269---直线位置关系
    poj1017----模拟
    MVC 提交List 集合 注意对应的参数名称
    使用 WebClient 來存取 GET,POST,PUT,DELETE,PATCH 網路資源
    对路径访问拒绝,要加上具体filename/c.png
    sql 列集合
    百度地图 Infowidow 内容(content 下标签) 点击事件
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/1326514.html
Copyright © 2011-2022 走看看