manejo - ¿Cómo enviar texto al Bloc de notas en C#/ Win32?
leer y escribir archivos en c# (3)
Primero debe encontrar la ventana secundaria donde se ingresa el texto. Puede hacer esto al encontrar la ventana secundaria con la clase de ventana "Editar". Una vez que tenga ese identificador de ventana, use WM_GETTEXT para obtener el texto que ya se ha ingresado, luego modifique ese texto (por ejemplo, agregue el suyo), luego use WM_SETTEXT para enviar el texto modificado nuevamente.
Intento usar SendMessage para el Bloc de notas, de modo que pueda insertar texto escrito sin hacer del Bloc de notas la ventana activa.
He hecho algo como esto en el pasado usando SendText
, pero eso requería que el Bloc de notas se enfocara.
Ahora, primero estoy recuperando el identificador de Windows:
Process[] processes = Process.GetProcessesByName("notepad");
Console.WriteLine(processes[0].MainWindowHandle.ToString());
Confirmé que es el identificador correcto para el Bloc de notas, el mismo que se muestra en Windows Task Manager
.
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
Desde aquí, no he podido hacer que SendMessage funcione en todos mis experimentos. ¿Voy en la dirección incorrecta?
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
private void button1_Click(object sender, EventArgs e)
{
Process [] notepads=Process.GetProcessesByName("notepad");
if(notepads.Length==0)return;
if (notepads[0] != null)
{
IntPtr child= FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null);
SendMessage(child, 0x000C, 0, textBox1.Text);
}
}
WM_SETTEXT = 0x000c
using System.Diagnostics;
using System.Runtime.InteropServices;
static class Notepad
{
#region Imports
[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll")]
private static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
//this is a constant indicating the window that we want to send a text message
const int WM_SETTEXT = 0X000C;
#endregion
public static void SendText(string text)
{
Process notepad = Process.Start(@"notepad.exe");
System.Threading.Thread.Sleep(50);
IntPtr notepadTextbox = FindWindowEx(notepad.MainWindowHandle, IntPtr.Zero, "Edit", null);
SendMessage(notepadTextbox, WM_SETTEXT, 0, text);
}
}