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

时间:2011-07-06 23:04:25

标签: c# winapi sendmessage

我正在搞乱Win32 API和Windows消息传递试图弄清楚事情是如何工作的,我发现了question very helpful

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

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

使用WM_XXXTEXT是否可以在32位和64位计算机上运行?如果记事本中有很多文本,那么建议的get / set算法是否仍然可行或者是否会占用大量资源?如果是这样,是否有另一种方法将文本附加到记事本窗口而不先复制其中的所有内容?

谢谢你的帮助!!

更新:

以下是我根据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);
            }

        } 

1 个答案:

答案 0 :(得分:8)

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

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

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