Estoy jugando con la API Win32 y los mensajes de Windows tratando de descubrir cómo funcionan las cosas y encontré esto question very helpful.Escribir texto en el bloc de notas con C#/Win32
Me gustaría mejorar la solución proporcionada allí para que agregue el texto en lugar de simplemente reemplazar el texto en el bloc de notas a través de WM_SETTEXT.
Mi pregunta es, ¿cómo usaría WM_GETTEXTLENGHT, seguido de WM_GETTEXT, para obtener el texto actual en la ventana del bloc de notas para poder agregarle texto nuevo antes de usar WM_SETTEXT?
¿El uso de WM_XXXTEXT funciona en máquinas de 32 y de 64 bits? Si hay mucho texto en el bloc de notas, ¿funcionaría el algoritmo de obtención/ajuste propuesto o acapararía un montón de recursos? Si es así, ¿hay alguna otra manera de agregar texto a la ventana del bloc de notas sin copiar todo en él primero?
Gracias por su ayuda !!
ACTUALIZACIÓN:
Este es el código que se me ocurrió sobre la base de la ayuda de David Heffernan y Google pegar n/SO cortar. Como soy nuevo en el Win32API y copié muchas líneas de diferentes fuentes, apreciaría todos los comentarios.
[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 y/o EM_REPLACESEL requieren el enfoque de la ventana? – Evan
Parece que no requiere enfoque, actualizaré mi pregunta con el código que estoy usando según su solución. ¡Gracias por tu ayuda! – Evan