如何在 Microsoft Office Word 中添加菜单项

2024-03-31

我尝试在 Microsoft Word 中创建一个右键菜单项this https://i.stack.imgur.com/6hXYg.png post.

这是我的代码:

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        try
        {
            eventHandler = new _CommandBarButtonEvents_ClickEventHandler(MyButton_Click);
            Word.Application applicationObject = Globals.ThisAddIn.Application as Word.Application;
            applicationObject.WindowBeforeRightClick += new Microsoft.Office.Interop.Word.ApplicationEvents4_WindowBeforeRightClickEventHandler(App_WindowBeforeRightClick);
        }
        catch (Exception exception)
        {
            MessageBox.Show("Error: " + exception.Message);
        }
    }

    void App_WindowBeforeRightClick(Microsoft.Office.Interop.Word.Selection Sel, ref bool Cancel)
    {
        try
        {
            this.AddItem();
        }
        catch (Exception exception)
        {
            MessageBox.Show("Error: " + exception.Message);
        }

    }
    private void AddItem()
    {
        Word.Application applicationObject = Globals.ThisAddIn.Application as Word.Application;
        CommandBarButton commandBarButton = applicationObject.CommandBars.FindControl(MsoControlType.msoControlButton, missing, "HELLO_TAG", missing) as CommandBarButton;
        if (commandBarButton != null)
        {
            System.Diagnostics.Debug.WriteLine("Found button, attaching handler");
            commandBarButton.Click += eventHandler;
            return;
        }
        CommandBar popupCommandBar = applicationObject.CommandBars["Text"];
        bool isFound = false;
        foreach (object _object in popupCommandBar.Controls)
        {
            CommandBarButton _commandBarButton = _object as CommandBarButton;
            if (_commandBarButton == null) continue;
            if (_commandBarButton.Tag.Equals("HELLO_TAG"))
            {
                isFound = true;
                System.Diagnostics.Debug.WriteLine("Found existing button. Will attach a handler.");
                commandBarButton.Click += eventHandler;
                break;
            }
        }
        if (!isFound)
        {
            commandBarButton = (CommandBarButton)popupCommandBar.Controls.Add(MsoControlType.msoControlButton, missing, missing, missing, true);
            System.Diagnostics.Debug.WriteLine("Created new button, adding handler");
            commandBarButton.Click += eventHandler;
            commandBarButton.Caption = "h5";
            commandBarButton.FaceId = 356;
            commandBarButton.Tag = "HELLO_TAG";
            commandBarButton.BeginGroup = true;
        }
    }

    private void RemoveItem()
    {
        Word.Application applicationObject = Globals.ThisAddIn.Application as Word.Application;
        CommandBar popupCommandBar = applicationObject.CommandBars["Text"];
        foreach (object _object in popupCommandBar.Controls)
        {
            CommandBarButton commandBarButton = _object as CommandBarButton;
            if (commandBarButton == null) continue;
            if (commandBarButton.Tag.Equals("HELLO_TAG"))
            {
                popupCommandBar.Reset();
            }
        }
    }
    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        Word.Application App = Globals.ThisAddIn.Application as Word.Application;
        App.WindowBeforeRightClick -= new Microsoft.Office.Interop.Word.ApplicationEvents4_WindowBeforeRightClickEventHandler(App_WindowBeforeRightClick);

    }

    #region VSTO generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InternalStartup()
    {
        this.Startup += new System.EventHandler(ThisAddIn_Startup);
        this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
    }
    #endregion
    //Event Handler for the button click

    private void MyButton_Click(CommandBarButton cmdBarbutton, ref bool cancel)
    {
        System.Windows.Forms.MessageBox.Show("Hello !!! Happy Programming", "l19 !!!");
        RemoveItem();
    }
}

}

当我右键单击一个字母时的结果:

但有了桌子我就做不到。查看屏幕截图以了解我的意思:

当我右键单击 MS Word 表格时,无法添加项目菜单。请帮我。 感谢!!

对不起我的英语,...


Word 维护多个上下文菜单。您可以通过枚举所有内容来查看所有内容CommandBar对象在Application.CommandBars谁的位置是msoBarPopup:

foreach (var commandBar in applicationObject.CommandBars.OfType<CommandBar>()
                               .Where(cb => cb.Position == MsoBarPosition.msoBarPopup))
{
    Debug.WriteLine(commandBar.Name);
}

链接示例中使用的命令栏是名为“文本”的命令栏,该命令栏与右键单击段落文本中的某处时弹出的上下文菜单相关。

但是,要向表的上下文菜单中添加某些内容,您必须将按钮添加到相应的表相关上下文菜单中。表格具有不同的上下文菜单,具体取决于您单击时选择的内容:

  • applicationObject.CommandBars["表格"]
  • applicationObject.CommandBars["表格文本"]
  • applicationObject.CommandBars["表格单元格"]
  • applicationObject.CommandBars["表格标题"]
  • applicationObject.CommandBars["表列表"]
  • applicationObject.CommandBars["表格图片"]

所以我建议你提取一个方法来添加一个按钮CommandBar然后您可以使用要添加按钮的所有命令栏调用该方法。像下面这样:

private void AddButton(CommandBar popupCommandBar)
{
    bool isFound = false;
    foreach (var commandBarButton in popupCommandBar.Controls.OfType<CommandBarButton>())
    {
        if (commandBarButton.Tag.Equals("HELLO_TAG"))
        {
            isFound = true;
            Debug.WriteLine("Found existing button. Will attach a handler.");
            commandBarButton.Click += eventHandler;
            break;
        }
    }
    if (!isFound)
    {
        var commandBarButton = (CommandBarButton)popupCommandBar.Controls.Add
            (MsoControlType.msoControlButton, missing, missing, missing, true);
        Debug.WriteLine("Created new button, adding handler");
        commandBarButton.Click += eventHandler;
        commandBarButton.Caption = "Hello !!!";
        commandBarButton.FaceId = 356;
        commandBarButton.Tag = "HELLO_TAG";
        commandBarButton.BeginGroup = true;
    }
}

// add the button to the context menus that you need to support
AddButton(applicationObject.CommandBars["Text"]);
AddButton(applicationObject.CommandBars["Table Text"]);
AddButton(applicationObject.CommandBars["Table Cells"]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Microsoft Office Word 中添加菜单项 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock

随机推荐

  • 如何在Spring jdbcTemplate中设置Array/List作为参数?

    我有带有许多占位符 的 SQL 查询 它是动态构建的 我想放置值数组来替换占位符 数组的大小每次都可以不同 数组按顺序由所有参数组成 return jdbcTemplate query Queries someQuery new Objec
  • IntelliJ IDE(Rider、Android Studio...)-如何隐藏属性/方法/等上方的“使用”链接

    IntelliJ Rider IDE 版本 2022 1 上面的类属性或方法我有这个链接称为 usages 如何转动 usages 链接关闭 他们快把我逼疯了 我不知道这些东西叫什么 所以谷歌搜索没有给我任何结果 我浏览了 IntelliJ
  • HTML 用 css 隐藏选择下拉箭头

    有没有一种好方法隐藏所有浏览器的默认下拉箭头 我知道这个问题已经被问过几次了 但似乎没有一个适用于所有浏览器的解决方案 而且它们看起来都不太好 几年过去了 不知道现在有没有好的解决方案 我能解决的最好方法是 select ms expand
  • htaccess 将index.php重定向到根目录(包括子域)

    我正在尝试将 index php 文件重定向到根 我四处搜索并发现了几个类似于以下内容的代码片段 RewriteCond THE REQUEST index php RewriteRule index php http www domain
  • 描述 Android 中的“top”命令

    我正在制作一个小型 Android 应用程序来显示当前的总 CPU 使用情况 例如 Windows 任务管理器中的 性能 选项卡 我使用 top m 1 n 1 d 1 来获取CPU使用率 但我并不真正理解 top 的结果 结果如下 Use
  • 以位图为背景在画布上绘制

    我正在尝试在我拍的照片上画画 绘图工作无需绘制图片 但如果我绘制位图 我只能看到位图 但会出现 n 绘图 我尝试了很多 但似乎没有任何帮助 提前致谢 private class myView extends View implements
  • 如何在没有 gulp/grunt/webpack 的情况下将 google-closure-compiler-js 用于 node.js 应用程序?

    The docs https github com google closure compiler js没有任何单独使用它的例子 但他们确实这样说 除非您使用 Gulp 或 Webpack 插件 否则您需要通过标志指定代码 jsCode 和
  • 使用 LINQ 在 JSON 中创建树层次结构

    我有一个随机顺序的一些名字的简单列表 是否可以编写单个 LINQ 语句来创建 JSON 中的树层次结构 以便根据以下示例所示的规则对它们进行分组 Input Banana Apple Cheery Lemon Orange Output A
  • 如何使用 MSVC 从 Windows 命令行构建 DLL

    我从事 C 语言工作已经有大约 20 年了 但我从未构建过 DLL 我一直更喜欢静态链接 我使用命令行 cl exe 等 和 gnumake makefile 来构建我的 Windows 应用程序 我现在想构建一个DLL 但我很困惑 最终
  • “字符串”类型的参数不可分配给字符串常量联合类型的参数[重复]

    这个问题在这里已经有答案了 我再次在这里寻求有关 Typescript 启发式的一些指导 我在编写类型保护时遇到了麻烦 因为 Typescript 在比较时想要太窄 考虑以下场景 或打字稿游乐场 https www typescriptla
  • Laravel 5 内存测试

    我正在通过 behat 为我的大型 Laravel 5 项目编写测试 我在 MySQL 中有一个 MySQL 数据库的测试副本 以及该数据库的一个播种器 它共享其他环境的一些播种器 所有这些都按预期进行 但是 我尝试切换到使用 sqlite
  • 是否需要事件总线注销

    我正在实施MVPAndroid 中的模式 我正在使用EventBus让知道P从活动 A 重新输入活动 B 发生的事情以更新 A 的视图 我在构造函数中将演示者注册到 EventBus 内部 但我没有看到任何可以取消注册它的地方 public
  • Git:虽然我已经完成了 git pull,但未能推送一些参考文献

    当我更改一些文件并尝试推送时 我开始出现 无法推送某些引用 错误 大多数说明都告诉我们先执行 git pull 我已经完成了 git 说一切都是最新的 知道如何解决该错误吗 我还开始收到 没有可用版本信息 消息 我不知道这与该错误有什么关系
  • 如何让java输出英文错误而不是其他语言?

    我的系统是中文的 当我的java程序出现错误时 可能会输出非英文的错误信息 无法阅读 Caused by java io IOException CreateProcess error 2 系统脮也禄碌陆指露 or IOException
  • Sails.js 单页应用程序 (SPA) — 将所有丢失/未使用的路由重定向到单个控制器操作

    我正在使用 Sails js 作为后端开发一个单页应用程序 SPA 我想要的只是将所有路由重定向到单个控制器操作 但是 当我执行以下操作时 config routes js module exports routes GET MainCon
  • 使用 Webpack 5 为 Next.js 配置文件加载器选项

    我正在尝试将 Nextjs 应用程序从 Webpack 4 升级到 Webpack 5 目前我使用file loader使用 next config js 中的选项 next config js module exports module
  • 在 Windows 8.1 平板电脑上的 Web 应用程序中捕获图像

    我即将开发一个在 Windows 8 1 平板电脑上运行的应用程序 一个重要的功能是能够单击按钮来访问相机来拍摄一些照片 理想情况下 我想将其创建为Web应用程序由于多种原因 许可证 跨平台 开发时间 没有本机应用程序经验等 而不是本机应用
  • Qt 和 unicode 转义字符串

    我使用信号和槽从服务器数据中获取数据 这是插槽部分 QString text this gt reply gt readAll 问题是 文本变量将是 unicode 转义 例如 u043d u0435 u043f u0430 u0440 u
  • 自上而下和自下而上编程[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 为什么我们说 C 等语言是自上而下的 而 Java 或 C 等 OOP 语言是自下而上的 这种分类对于软件开发有什么重要性吗 自上而下 的方
  • 如何在 Microsoft Office Word 中添加菜单项

    我尝试在 Microsoft Word 中创建一个右键菜单项this https i stack imgur com 6hXYg png post 这是我的代码 private void ThisAddIn Startup object s