2009-02-07 21 views
24

Sto tentando di utilizzare SendMessage nel Blocco note, in modo da poter inserire testo scritto senza rendere Blocco note la finestra attiva.Come inviare testo a Blocco note in C#/Win32?

Ho fatto qualcosa del genere in passato usando SendText, ma ciò richiedeva la messa a fuoco del Blocco note.

Ora, prima sto recuperando la maniglia di Windows:

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

Ho confermato che sia la maniglia giusta per il Blocco note, lo stesso mostrato all'interno Windows Task Manager.

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

Da qui, non sono stato in grado di ottenere SendMessage per lavorare in tutta la mia sperimentazione. Sto andando nella direzione sbagliata?

risposta

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

Devi prima trovare la finestra secondaria in cui è inserito il testo. È possibile farlo trovando la finestra secondaria con la classe della finestra "Modifica". Una volta ottenuto l'handle della finestra, utilizzare WM_GETTEXT per ottenere il testo già inserito, quindi modificare il testo (ad es. Aggiungerne uno), quindi utilizzare WM_SETTEXT per inviare il testo modificato indietro.

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); 
    } 
} 
Problemi correlati