我搞砸Win32 API和Windows消息试图弄清楚事情是如何工作的,我发现这个question very helpful。用C#/ Win32写文本到记事本
我想改进提供的解决方案,以便它附加文本而不是通过WM_SETTEXT替换记事本中的文本。
我的问题是,我将如何使用WM_GETTEXTLENGHT,紧接着WM_GETTEXT,获取记事本窗口中的当前文本,以便我可以在使用WM_SETTEXT之前向它追加新文本?
在32位和64位计算机上都使用WM_XXXTEXT吗?如果记事本中有很多文本,那么建议的获取/设置算法是否仍然有效,或者是否会占用大量资源?如果是这样,是否有另一种方式来追加文本到记事本窗口,而不是先复制所有内容?
感谢您的帮助!
UPDATE:
这里是我想出了根据大卫·赫弗南的帮助和谷歌/ 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是否需要窗口焦点? – Evan
它似乎并不需要关注,我会根据您的解决方案使用我正在使用的代码更新我的问题。谢谢你的帮助! – Evan