当前位置: 首页 > news >正文

WPF 标题栏 右键窗口标题添加关于对话框

原文: WPF 标题栏 右键窗口标题添加关于对话框

/// <summary>
    /// wpf标题栏 右键菜单 中添加新项
    /// </summary>
    public partial class MainWindow : Window
    {
        private const int WM_SYSCOMMAND = 0x112;
        private const int MF_STRING = 0x0;
        private const int MF_SEPARATOR = 0x800;

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool AppendMenu(IntPtr hMenu, int uFlags, int uIDNewItem, string lpNewItem);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool InsertMenuItem(IntPtr hMenu, int uPosition, int uFlags, int uIDNewItem, String ipNewItem);

        private int SYSMENU_ABOUT_ID = 0x1;
        public MainWindow()
        {
            InitializeComponent();
            SourceInitialized += MainWindow_SourceInitialized;
        }

        #region 给wpf标题栏的右键菜单栏 添加 “关于”菜单项
        private void MainWindow_SourceInitialized(object sender, EventArgs e)
        {
            var handle = (new WindowInteropHelper(this)).Handle;
            IntPtr hSysMenu = GetSystemMenu(handle, false);
            AppendMenu(hSysMenu, MF_SEPARATOR, 0, String.Empty);
            AppendMenu(hSysMenu, MF_STRING, SYSMENU_ABOUT_ID, "关于");
        } 
        #endregion

        #region 模拟实现 winform程序中的WndProc方法
        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
            source.AddHook(WndProc);
        }
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            // Handle messages...  
            if ((msg == WM_SYSCOMMAND) && ((int)wParam == SYSMENU_ABOUT_ID))
            {
                //表示监听到 关于菜单 按钮的 点击事件,并执行以下操作
                System.Windows.MessageBox.Show("good");
            }
            return IntPtr.Zero;
        } 
        #endregion
    }


winform中的实现方式

private const int WM_SYSCOMMAND = 0x112;
        private const int MF_STRING = 0x0;
        private const int MF_SEPARATOR = 0x800;

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool AppendMenu(IntPtr hMenu, int uFlags, int uIDNewItem, string lpNewItem);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool InsertMenuItem(IntPtr hMenu, int uPosition, int uFlags, int uIDNewItem, String ipNewItem);

        private int SYSMENU_ABOUT_ID = 0x1;

        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);

            //TestForm tsf = new TestForm();
            IntPtr hSysMenu = GetSystemMenu(this.Handle, false);
            AppendMenu(hSysMenu, MF_SEPARATOR, 0, String.Empty);
            AppendMenu(hSysMenu, MF_STRING, SYSMENU_ABOUT_ID, "关于 (&A) ...");
        }

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if ((m.Msg==WM_SYSCOMMAND) && ((int)m.WParam==SYSMENU_ABOUT_ID))
            {
                TestForm testform = new TestForm();
                testform.ShowDialog();
            }
        }


参考文章:


 

<a href='https://download.csdn.net/download/zxc000/8542729'>https://download.csdn.net/download/zxc000/8542729</a>
<a href='https://blog.csdn.net/DoitPlayer/article/details/72832954'>https://blog.csdn.net/DoitPlayer/article/details/72832954</a>
<a href='https://www.cnblogs.com/liunlls/p/wpf-WindowInteropHelper.html'>https://www.cnblogs.com/liunlls/p/wpf-WindowInteropHelper.html</a>
<a href='https://blog.csdn.net/lucifinil_s/article/details/6384111'>https://blog.csdn.net/lucifinil_s/article/details/6384111</a>

 

相关文章:

  • 利用矩阵快速幂转换的题目
  • 最新软件工程师薪资大揭秘!你的薪资达到平均水平了吗?
  • Java自学之路(小白向)
  • 由两个栈组成队列
  • jenkins1
  • 为什么要用到Nginx来做负载均衡?通俗的解释
  • hdu_2955
  • Linux常用命令 — 用户管理useradd、passwd、who、w
  • Python(可变/不可变类型,list,tuple,dict,set)
  • 元素尺寸和位置,scroll事件,事件响应链,事件默认行为
  • 修改input type=file 默认样式
  • 3分钟读懂C语言函数:这些例子一看就懂!|一键删除账户教学
  • ubuntu壁纸1080p
  • [转]bootstrap table本地数据使用方法
  • vue系列自定义指令(三)
  • 230. Kth Smallest Element in a BST
  • classpath对获取配置文件的影响
  • java小心机(3)| 浅析finalize()
  • Linux后台研发超实用命令总结
  • linux学习笔记
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • oldjun 检测网站的经验
  • Promise初体验
  • 程序员最讨厌的9句话,你可有补充?
  • 从伪并行的 Python 多线程说起
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 运行时添加log4j2的appender
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 正则与JS中的正则
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • #传输# #传输数据判断#
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #预处理和函数的对比以及条件编译
  • (C语言)逆序输出字符串
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (离散数学)逻辑连接词
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四) Graphivz 颜色选择
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)基于IDEA的JAVA基础12
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .cfg\.dat\.mak(持续补充)
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET程序员迈向卓越的必由之路
  • .net生成的类,跨工程调用显示注释
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复