2009-02-07 21 views
24

Estoy tratando de usar SendMessage para el Bloc de notas, para poder insertar texto escrito sin hacer que el Bloc de notas sea la ventana activa.¿Cómo enviar texto al Bloc de notas en C#/Win32?

He hecho algo como esto en el pasado usando SendText, pero eso requería darle al Bloc de notas el foco.

Ahora, en primer lugar estoy recuperar el identificador de Windows:

Process[] processes = Process.GetProcessesByName("notepad"); 
Console.WriteLine(processes[0].MainWindowHandle.ToString()); 

He confirmado que es el mango adecuado para el Bloc de notas, el mismo se muestra dentro de Windows Task Manager.

[DllImport("User32.dll", EntryPoint = "SendMessage")] 
public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam); 

A partir de aquí, no he sido capaz de conseguir SendMessage para trabajar en toda mi experimentación. ¿Voy en la dirección incorrecta?

Respuesta

35
[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

6

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 propio) y luego use WM_SETTEXT para enviar el texto modificado nuevamente.

0
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); 
    } 
} 
Cuestiones relacionadas