用c# /Win32编写文本到记事本
本文关键字:文本 记事本 Win32 | 更新日期: 2023-09-27 18:01:28
我正在摆弄Win32 API和windows消息传递,试图弄清楚事情是如何工作的,我发现这个问题非常有用。
我想改进那里提供的解决方案,以便它附加文本,而不仅仅是通过WM_SETTEXT替换记事本中的文本。
我的问题是,我如何使用wm_gettextight,其次是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);
}
}
发送EM_SETSEL
将插入符号放置到编辑窗口的末尾。然后发送EM_REPLACESEL
来附加文本。
如果编辑控件包含大量文本,这比读取整个内容,附加您的添加内容,然后设置整个内容要好得多。
这些方法可以很容易地跨越32/64位进程边界。