使用 C#/Win32 将文本写入记事本

2024-03-25

我正在摆弄 Win32 API 和 Windows 消息传递,试图弄清楚事情是如何工作的,我发现了这个问题非常有帮助 https://stackoverflow.com/questions/523405/how-to-send-text-to-notepad-in-c-win32.

我想改进那里提供的解决方案,以便它附加文本,而不是仅仅通过 WM_SETTEXT 替换记事本中的文本。

我的问题是,如何使用 WM_GETTEXTLENGHT,然后使用 WM_GETTEXT 来获取记事本窗口中的当前文本,以便我可以在使用 WM_SETTEXT 之前向其附加新文本?

使用 WM_XXXTEXT 在 32 位和 64 位机器上都有效吗?如果记事本中有大量文本,建议的获取/设置算法仍然有效还是会占用大量资源?如果是这样,是否有另一种方法可以将文本附加到记事本窗口,而无需先复制其中的所有内容?

谢谢你的帮助!!

UPDATE:

这是我根据 David Heffernan 的帮助和 Google/SO 剪切粘贴得出的代码。由于我是 Win32API 的新手,并且从不同来源复制了许多行,因此我非常感谢所有反馈。

[DllImport("User32.dll", CharSet = CharSet.Auto)]
        extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, [In] string lpClassName, [In] string lpWindowName);

        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        extern static int SendMessageGetTextLength(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

        [DllImport("User32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

        [DllImport("User32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);

        const int WM_GETTEXTLENGTH = 0x000E;

        const int EM_SETSEL = 0x00B1;

        const int EM_REPLACESEL = 0x00C2;

        public void testAppendText(string text)
        {
            Process[] notepads = Process.GetProcessesByName("notepad");
            if (notepads.Length == 0) return;
            if (notepads[0] != null)
            {
                IntPtr editBox = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null);
                int length = SendMessageGetTextLength(editBox, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero);
                SendMessage(editBox, EM_SETSEL, length, length);
                SendMessage(editBox, EM_REPLACESEL, 1, text);
            }

        } 

Send EM_SETSEL将插入符号放在编辑窗口的末尾。然后发送EM_REPLACESEL附加文本。

如果编辑控件包含大量文本,这比读取整个内容、附加添加内容然后设置整个内容要好得多。

这些方法可以毫无困难地跨越 32/64 位进程边界。

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

使用 C#/Win32 将文本写入记事本 的相关文章

随机推荐

  • 如何从map/filter等执行异步操作(即返回Future)?

    我有一个DataSet map需要从外部 REST API 提取数据的操作 REST API 客户端返回一个Future Int 是否有可能拥有DataSet map操作以某种方式等待这个Future异步 或者我需要使用来阻止线程Await
  • 如何确定用户是否按下 UITableViewCell 2 秒?

    我正在使用手势识别器 初始化于viewDidLoad UILongPressGestureRecognizer longPressRecognizer UILongPressGestureRecognizer alloc initWithT
  • 如何使用jquery取消绑定mouseleave点击

    我有一个 div 当您鼠标输入时 它会预览正在显示的图像 当您鼠标离开时 它会再次隐藏它 我想要实现的是 当您单击该 div 时 它会动画并显示 但我想随后取消绑定 mouseleave 功能 以便图像保留在不起作用的屏幕上 mousele
  • 从插入符递归特征消除 (rfe) 结果中检索选定的变量

    在我的工作项目中 我使用 caret 包中的 rfe 函数来进行递归特征消除 我用一个玩具例子来说明我的观点 library mlbench library caret data PimaIndiansDiabetes rfFuncs su
  • 如何对 scipy.sparse.csr_matrix 类型的矩阵进行元素运算?

    在 numpy 中 如果你想计算矩阵每个条目的正弦 元素化 那么 a numpy arange 0 27 3 reshape 3 3 numpy sin a 会完成工作的 如果你想要力量 让我们说每个条目 2 个 a 2 会做的 但如果你有
  • 将参数发送到驻留在另一个进程中的应用程序实例

    我有一个单实例应用程序 c WPF net3 51 检查应用程序是否已实例化是通过互斥体完成的 如果应用程序已在运行 我会从已打开的应用程序实例中打开一个新窗口 到目前为止效果很好 但是 由于应用程序扩展 我现在必须将 e Args 或至少
  • C# .net读取.mdb文件

    我有必要使用 C net 编写一个应用程序来编辑特定的 mdb 文件 它纯粹是一个部门内应用程序 用于读取部门内文件 有争议的是 这些文件不应该是 mdb 文件 但我在这方面没有选择 我正在推动更改为 XML 文件 但那是另一回事 这些文件
  • PlotLegends 使 Manipulate[] ing 图形变得慢如爬行

    我设置了一个简短的程序 使用 Manipulate 显示具有不同参数的相同函数的三个图 我想用参数的值来标记每个函数 我的出发点是让一个传奇人物出现 在绘图中添加 PlotLegend 会导致 Mathematica 变得异常缓慢 我的代码
  • C# 中两个 List<> 相交

    我有两个List
  • Three.js 在平面上旋转相机

    我的应用程序中有一个相机 camera new THREE PerspectiveCamera 75 window innerWidth window innerHeight 0 1 1000 camera position z 1 cam
  • Python OOP 继承:方法解析顺序 (MRO)

    当我使用方法解析顺序 MRO 时 输出存在变化 任何人都可以解释为什么结果会出现这种差异 class A def init self pass def abc self print A class B A def init self pas
  • Python 字符串的所有可能组合

    你好 我正在使用 python 我正在尝试编写一个方法 其中给定一个字符串 它会找到该字符串的每个组合并将其附加到列表中 我将给出字符串并显示我想要的结果 string x god outcome lst g o d go gd og od
  • Passport.js + Express.js 在身份验证后将用户转发到原始目的地

    我有一个应用程序 服务器上是 Node Express Passport 客户端上是 jQuery Backbone js 客户端在 URL 中使用哈希标签 但对于某些功能来说 用户登录非常重要 我希望可以通过 URL 访问该应用程序 例如
  • PHP 阿拉伯文文本使用 strpos 进行比较

    我在 mysql 表中有一个阿拉伯语关键字 例如 1591 1610 1585 1575 1606 请考虑用 代替 带有 的值会自动转换为阿拉伯语 Mysql表编码 utf8 general ci 我从外部资源示例 twitter 中获取一
  • laravel 5 - css 文件未在资产清单中定义?

    我收到 laravel 5 的错误消息 我不明白 Next exception ErrorException with message File build css all css not defined in asset manifest
  • 在 C++ 中如何知道数组包含多少个元素? [复制]

    这个问题在这里已经有答案了 例如 我有一个包含 3 个元素的数组 int array 1 4 66 我怎么知道有多少个元素array包含 执行此操作 std size myarray std size https en cppreferen
  • 无法导入 play.api.db.databases

    我正在 Scala Play 2 5 4 中开发一个应用程序 我想测试我的数据库交互 并尝试通过中推荐的方法来测试这一页 https www playframework com documentation 2 5 x ScalaTestin
  • 如何从命令行使用密码生成 openSSL 密钥?

    首先 如果我不提供密码会怎样 是否使用了某种伪随机短语 我只是在寻找 足够好 的东西来阻止休闲黑客 第二 如何从命令行生成密钥对 并在命令行上提供密码 我终于使用这些命令让它工作 使用 exec 通常认为使用不安全 最好在文件中给出 Pas
  • 使用相对 URL 切换到 SSL

    我想创建一个相对链接来切换当前协议http to https 我工作的最后一个地方在服务器上设置了一些东西 以便您可以实现这一点 但我不太记得它 而且我从来不知道它是如何工作的 这样做的理由是 我不需要在需要在生产和开发环境之间移动的文件中
  • 使用 C#/Win32 将文本写入记事本

    我正在摆弄 Win32 API 和 Windows 消息传递 试图弄清楚事情是如何工作的 我发现了这个问题非常有帮助 https stackoverflow com questions 523405 how to send text to