Я возился с Win32 API и обменом сообщениями Windows, пытаясь понять, как все работает, и нашел этот вопрос очень полезным .
Я хотел бы улучшить решение, предоставленное там, чтобы оно добавляло текст вместо простой замены текста в блокноте через WM_SETTEXT.
Мой вопрос: как мне использовать WM_GETTEXTLENGHT, а затем WM_GETTEXT, чтобы получить текущий текст в окне блокнота, чтобы затем добавить к нему новый текст перед использованием WM_SETTEXT?
Работает ли использование WM_XXXTEXT как на 32-битных, так и на 64-битных машинах? Если в блокноте много текста, будет ли предложенный алгоритм get / set работать или он потребует много ресурсов? Если да, то есть ли другой способ добавить текст в окно блокнота, не копируя сначала все в нем?
Спасибо за помощь !!
ОБНОВЛЕНИЕ:
Вот код, который я придумал на основе кода Дэвида Хеффернана помогите и гугл / 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);
}
}