C# 中的 MS Word 插件文本更改事件

2024-03-21

我有一个 Microsoft Word 插件,可以在文本中查找相似的单词(但是当我单击按钮时!)

我的问题是:当用户输入单词时如何调用函数?

换句话说,当用户键入以获取当前单词并处理它并获取它的相似单词时,我想要一个像“TextChange”或“Keypress”这样的事件。

像这样的事情:

private void TextChangeEventOfCurrentActiveDocument(object sender, System.EventArgs e)
{
    ...
}

我可以获得用户输入的新单词还有其他想法吗?

Thanks.


终于,经过很长一段时间,我使用 Windows hooks 创建了这个插件。

(特别感谢@Reg编辑)

这是我编写的整个代码,这对我来说很好用。 (删除了一些可选的代码部分。)

ThisAddIn.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Word = Microsoft.Office.Interop.Word;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Word;
using System.Windows.Forms;

using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;

namespace PersianWords
{
    public partial class ThisAddIn
    {

        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;

        private static IntPtr hookId = IntPtr.Zero;
        private delegate IntPtr HookProcedure(int nCode, IntPtr wParam, IntPtr lParam);
        private static HookProcedure procedure = HookCallback;

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);

        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, HookProcedure lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

        private static IntPtr SetHook(HookProcedure procedure)
        {
            using (Process process = Process.GetCurrentProcess())
            using (ProcessModule module = process.MainModule)
                return SetWindowsHookEx(WH_KEYBOARD_LL, procedure, GetModuleHandle(module.ModuleName), 0);
        }


        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {

            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int pointerCode = Marshal.ReadInt32(lParam);

                if (pointerCode == 162 || pointerCode == 160)
                {
                    return CallNextHookEx(hookId, nCode, wParam, lParam);
                }

                string pressedKey = ((Keys)pointerCode).ToString();

                //Do some sort of processing on key press
                var thread = new Thread(() =>
                {

                    MyClass.WrdApp.CustomizationContext = MyClass.WrdApp.ActiveDocument;

                    //do something with current document


                });
                thread.Start();
            }



            return CallNextHookEx(hookId, nCode, wParam, lParam);
        }


        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            hookId = SetHook(procedure);

            MyClass.WrdApp = Application;

            MyClass.WrdApp.CustomizationContext = MyClass.WrdApp.ActiveDocument;

        }


        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
            UnhookWindowsHookEx(hookId);
        }

    #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
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中的 MS Word 插件文本更改事件 的相关文章

  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft

随机推荐

  • 删除所有换行符并将其添加到特定文本之后

    我有一个文本文件 其中必须删除所有换行符 然后在每个文本后添加新的换行符 我怎样才能使用替换工具做到这一点 您至少需要分两步完成 首先 单击工具栏中的 符号 您可以查看是否有CRLF行结尾或只是LF 单击 替换 按钮 然后将 r n or
  • touchmove 事件不会在 Android 版谷歌浏览器上触发

    这是针对 客户签名 组件的反应 touchmove 事件不会在 Android 版 Google Chrome 浏览器上触发 我使用的是三星 Galax 平板电脑 a 2016 我通过 USB 控制台将平板电脑连接到我的电脑 在我的 com
  • bash: /usr/local/android-sdk-linux/tools/android: 权限被拒绝

    我正在尝试在 Ubuntu 上安装手机间隙 我遵循了所有必要的步骤并在 Ubuntu 上成功安装了 android sdk 但是当我在终端中输入 android 时 它显示权限被拒绝 我如何更改权限 错误是 bash usr local a
  • PHP 中 echo、echo()、print 和 print() 之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中的 echo 和 print 有何不同 https stackoverflow com questions 234241 how are echo and print different i
  • Python根据值绘制不同颜色的散点图

    我有一个数据框 我想绘制散点图 数据框看起来像 year length Animation 0 1971 121 1 1 1939 71 1 2 1941 7 0 3 1996 70 1 4 1975 71 0 我希望散点图中的点具有不同的
  • 启用了 selinux 的 Docker - 不允许在 /usr 中重新标记内容

    我在 Centos7 上安装了 Docker 并将 selinux 设置为在主机上强制执行 并且 Docker 守护进程以 selinux enabled 标志启动 当我尝试运行以下命令时 docker run it v usr local
  • 当用户注销 React Native 应用程序时,如何删除 Firebase Cloud Messaging Token?

    我使用 React Native FCM 进行消息传递 当用户注销应用程序时 我想删除 FCM 令牌 以便用户不会再次收到通知 下面是我的注销代码 signOutAsync async gt this logoutEvent API pos
  • Kivy Popup渲染问题

    我正在开发一个公交车司机应用程序 偶尔 应用程序 通过服务器 订阅的 MQTT 主题上会发布消息 当出现此类消息时 必须出现弹出窗口 我定制了默认的 Kivy 弹出窗口 更改了背景 添加了带有标签和按钮的 FloatLayout 作为内容
  • 如何使用 LINQ to SQL 创建排名搜索结果?

    我正在寻找一种使用 l2s 根据关键字返回排名结果的方法 我想使用一个关键字并能够使用该关键字在表中搜索该关键字 contains 我无法弄清楚的技巧是如何计算该 keyqord 出现的次数 然后 OrderByDescending 根据该
  • 计算 2D 向量叉积

    来自维基百科 叉积是a中两个向量的二元运算三维欧几里得空间产生另一个向量 该向量垂直于包含两个输入向量的平面 鉴于该定义仅定义为三个 或七 一和零 https en wikipedia org wiki Seven dimensional
  • 为什么 jQuery 无法在 Facebook 中加载?

    情况 我正在编写一个适用于任何页面的 Chrome 扩展 问题问题 我无法将 jQuery 加载到 Facebook 我想了解发生了什么 假设 Facebook 拥有一些超先进的技术 可以以某种方式检测到 当 jQuery 通过 chrom
  • LINQ To SQL 异常:本地序列不能在查询运算符(Contains 运算符除外)的 LINQ to SQL 实现中使用

    考虑这个 LINQ To SQL 查询 其目的是获取搜索词的 string 并将这些词应用到 SQL 表上的一堆不同字段 string searchTerms new string hello world foo List
  • JDK 可以使用 apt-get install 吗?

    我使用 Linux 机器还不到两周 所以我对 Linux 非常陌生 我还想安装 Java 开发人员工具包 这应该怎么做呢 有没有一个apt get命令 或者我应该单击 Sun 网站上的下载按钮 我确信有不止一种方法可以做到这一点 而且可能并
  • 在 iOS 中围绕枢轴点旋转 ImageView

    记录和旋转搜索栏 我在下面有一个应用程序屏幕来录制 最多 30 秒 音频 如何在录制音频时平滑地将小圆圈旋转为虚线圆线上的搜索栏 当小圆圈沿线旋转时 如何填充虚线 Thanks 答案是有两种方法可以使用PanGesture并自动使用Time
  • Java 7 未签名小程序权限 1.7.0_45

    我们有一个需要某些权限的小程序 我们对其进行签名并授予所有权限 然而 在开发时我们使用未签名的小程序 我们在用户主目录中的 java policy 文件中设置所有权限 这在 1 7 0 45 或可能 40 中已停止工作 因为未签名的小程序不
  • 有什么方法可以检查 Python 文件是否符合 Numpy 文档风格? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个需要 Numpy 文档的项目 在我的 Java 时代 我记得有 linter 来检查 E
  • Angular 2 document.removeEventListener 在类中不起作用

    操作结束时我无法删除事件 我通过单击启动事件 span class leftTopPoint span export class SectionComponent initResize e void this mouseX e client
  • 在 JavaScript 中将一个数组附加到另​​一个数组[重复]

    这个问题在这里已经有答案了 这个问题与以下问题完全相同 如何将数组附加到现有的 JavaScript 数组 https stackoverflow com questions 1374126 how to append an array t
  • 无法通过ldap3 Python3更改用户密码

    每当我尝试通过 ldap3 库更改某人的密码时 都会收到以下错误 type modifyResponse result 53 message 0000001F SvcErr DSID 031A12D2 problem 5003 WILL N
  • C# 中的 MS Word 插件文本更改事件

    我有一个 Microsoft Word 插件 可以在文本中查找相似的单词 但是当我单击按钮时 我的问题是 当用户输入单词时如何调用函数 换句话说 当用户键入以获取当前单词并处理它并获取它的相似单词时 我想要一个像 TextChange 或