将自定义上下文菜单项添加到 Windows 窗体标题栏

2023-11-23

I found a threadMSDN 上展示了如何将项目添加到 Windows 窗体标题栏的上下文菜单。

不幸的是,它没有显示如何使用自定义菜单项注册事件,我一直无法弄清楚如何做到这一点。下面是一个示例应用程序,可以将其复制并粘贴到新的 Windows 窗体应用程序中。我怎样才能完成样品?

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            IntPtr hMenu = GetSystemMenu(Handle, false);
            if (hMenu != IntPtr.Zero)
            {
                var menuInfo = new MENUITEMINFO
                   {
                       cbSize = (uint) Marshal.SizeOf(typeof (MENUITEMINFO)),
                       cch = 255,
                       dwTypeData = "Test Item",
                       fMask = 0x1 | 0x2 | 0x10,
                       fState = 0,
                       fType = 0x0
                   };

                InsertMenuItem(hMenu, 0, true, ref menuInfo);
                DrawMenuBar(Handle);
            }
        }

        [DllImport("user32.dll")]
        static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
        [DllImport("user32.dll")]
        static extern bool DrawMenuBar(IntPtr hWnd);
        [DllImport("user32.dll")]
        static extern bool InsertMenuItem(IntPtr hMenu, uint uItem,
                          bool fByPosition, [In] ref MENUITEMINFO lpmii);


        [StructLayout(LayoutKind.Sequential)]
        public struct MENUITEMINFO
        {
            public uint cbSize;
            public uint fMask;
            public uint fType;
            public uint fState;
            public uint wID;
            public IntPtr hSubMenu;
            public IntPtr hbmpChecked;
            public IntPtr hbmpUnchecked;
            public IntPtr dwItemData;
            public string dwTypeData;
            public uint cch;
            public IntPtr hbmpItem;
        }
    }
}

您必须覆盖WndProc方法并拦截新菜单的 id。

尝试这个:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication11
{
  public partial class Form1 : Form
  {
    public const Int32 WM_SYSCOMMAND = 0x112;
    public const Int32 MF_BYPOSITION = 0x400;
    public const Int32 MYMENU1 = 1000;
    public const Int32 MUMENU2 = 1001;

    [DllImport("user32.dll")]
    private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
    [DllImport("user32.dll")]
    private static extern bool InsertMenu(IntPtr hMenu, Int32 wPosition, Int32 wFlags, Int32 wIDNewItem, string lpNewItem);

    public Form1()
    {
      InitializeComponent();
    }

    protected override void WndProc(ref Message msg)
    {
      if (msg.Msg == WM_SYSCOMMAND)
      {
        switch (msg.WParam.ToInt32())
        {
          case MYMENU1:
            MessageBox.Show("Hi from My Menu 1¡¡¡¡");
            return;
          case MUMENU2:
            MessageBox.Show("Hi from My Menu 2¡¡¡¡");
            return;
          default:
            break;
        }
      }
      base.WndProc(ref msg);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      IntPtr MenuHandle = GetSystemMenu(this.Handle, false);
      InsertMenu(MenuHandle, 5, MF_BYPOSITION, MYMENU1, "My Menu 1");
      InsertMenu(MenuHandle, 6, MF_BYPOSITION, MUMENU2, "My Menu 2");
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将自定义上下文菜单项添加到 Windows 窗体标题栏 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • 在 javascript 中的数组文字上调用 forEach 时出错[重复]

    这个问题在这里已经有答案了 当我使用 Node v6 9 2 运行此代码时会生成错误 var req foo bar forEach prop gt console log prop prop 错误是 TypeError Cannot re
  • 在android中从图库和相机捕获图像

    我首先知道这是一个重复的问题 但我在从画廊或相机捕获图像方面没有问题 我在虚拟项目上创建来检查我的代码 它工作正常 但是当我在我的项目中使用相同的代码时 即使我没有收到任何错误 它也不起作用 一旦我开始活动以获取结果 它就会被取消 但我仍然
  • 如何修复 1 字节 UTF-8 序列的无效字节 1

    我正在尝试使用 java 方法从数据库获取以下 xml 但出现错误 用于解析xml的代码 DocumentBuilderFactory dbf DocumentBuilderFactory newInstance DocumentBuild
  • 我什么时候应该使用一对一关系?

    抱歉这个菜鸟问题 但是是否确实需要与数据库中的表使用一对一关系 您可以在一张表中实现所有必需的字段 即使数据变得非常大 您也可以枚举您需要的列名SELECT声明而不是使用SELECT 你什么时候真正需要这种分离 1 到 0 1 超类和子类之
  • 如何创建模块化 JSF 2.0 应用程序?

    我有一个具有明确定义的界面的应用程序 它使用 CDI 来解析模块 具体来说 它使用 API 接口上的 Instance 注入点来解析模块 并通过接口毫无问题地来回传递各种数据 我故意将 API 和实现分开 模块仅从 API 继承以避免紧密耦
  • 从 Delphi REST 服务器返回图像并在浏览器中显示它

    当您在 Delphi Rest 服务器中使用文件流对象返回图像时 它将不会在浏览器中显示 以下是返回图像的示例方法 function TServerClass Image TFileStream begin Result TFileStre
  • java.lang.RuntimeException:Parcel android.os.Parcel:解组未知类型代码

    我的应用程序中似乎出现了一个奇怪的错误 请参阅GitHub 当我将对象传递给实现的不同活动时 就会发生这种情况Parcelable 我在 Stack Overflow 上检查了其他问题和答案 但无法找到解决方案 我已经尝试过答案here 例
  • List 内的 NavigationLink 适用于 HStack 而不是每个元素

    我正在努力追随组合复杂的接口SwiftUI 指南 但在让 NavigationLink 在 iOS 13 beta 3 和现在的 beta 4 上正常工作时遇到问题 如果您只是下载项目文件并尝试运行它 请单击任何 Lake 图像 什么都不会
  • 是否可以在 ASP.NET MVC 路径中的查询字符串变量到达控制器之前更改它?

    我在 ASP NET MVC 中有一个控制器方法 如下所示 public ActionResult GetAlbumPictures int albumId var album AlbumRepo GetSingle albumId var
  • 执行 exe 时出现未知发布者错误

    我已经部署了我的 Windows 应用程序项目 但是当我运行它时 它首先抛出错误 未知发布者 如何隐藏此消息 您必须对包进行数字签名以防止此类错误 http msdn microsoft com library ms172240 aspx
  • Java - 执行 I/O 操作时的线程状态

    假设 Java 线程执行一些 I O 操作 例如使用传统的阻塞 Java I O 读取文件 问题是 等待时线程的状态是什么 我不知道它是正在运行 进行一些主动等待 还是正在等待 也许有某种监视器在文件数据准备好时唤醒线程 我怎样才能找到它
  • 可以在 php 5.2.6 中使用 SplEnum 吗?

    我尝试使用类 abstract class my abstractEnum extends SplEnum and class my categoryEnum extends my abstractEnum 我有 致命错误 未找到 SplE
  • 需要 Gradle 版本 2.2。当前版本是2.10

    我正在尝试使用 gradle 构建 它给了我错误的说法 无法应用插件 id com android library 需要 Gradle 版本 2 2 当前版本是2 10 如果使用 gradle 包装器 请尝试将 home sanjeewa
  • 致命错误:超出最大执行时间 300 秒

    我不断收到此 PHP 错误 致命错误 超出最大执行时间 300 秒 我尝试过设置我的max execution time and my max input timephp ini apache 和 cli 中的设置0 1 and 4000每
  • 模式匹配“返回”值

    为什么不可能链接模式匹配结构 例如 以下内容是合法的 如果是无意义的 val a ADT 5 val b a match case ADT a if a gt 4 gt ADT a 3 case ADT a gt ADT a 1 b mat
  • MySQL 事务与会计应用程序

    我有一个如下表 transaction id user id other user id trans type amount 该表用于维护金融类型应用程序的帐户交易 它采用复式记账法 因此从用户 A 到 B 的转账将在表中插入两行 如下所示
  • 地理坐标到街道名称

    是任何方式 与restAPI会很棒 来获取与地理坐标对应的街道名称 我认为这个名字是geocoding google有这个API吗 我是 PHP 开发人员 Ex 因此该函数的输出是街道名称 邮政编码和城市 感谢您提供任何帮助和脚本示例 是的
  • 函数侦听器无法启动。 Azure函数应用程序时间触发

    当我在本地环境中从 Visual Studio 运行 azure 函数时 出现以下错误 函数 Function1 的侦听器无法启动 Microsoft WindowsAzure Storage 错误请求 这是我的代码 using Syste
  • Vim - 如何使您自己的映射可重复?

    我的 vimrc 中有以下映射 nmap
  • 将自定义上下文菜单项添加到 Windows 窗体标题栏

    I found a threadMSDN 上展示了如何将项目添加到 Windows 窗体标题栏的上下文菜单 不幸的是 它没有显示如何使用自定义菜单项注册事件 我一直无法弄清楚如何做到这一点 下面是一个示例应用程序 可以将其复制并粘贴到新的