2009-02-07 14 views
24

SendMessage'ı Not Defteri'ne kullanmaya çalışıyorum, böylece aktif pencereyi Notepad yapmadan yazılı metin ekleyebilirim.C#/Win32 içinde Not Defteri'ne metin nasıl gönderilir?

SendText'u kullanarak böyle bir şey yaptım, ancak Notepad odaklaması gerekli.

Şimdi, ilk Windows kolu alınırken ediyorum:

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

Ben Windows Task Manager içinde gösterilen aynı, bu Not Defteri için doğru kolu var onayladık. Buradan

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

, ben SendMessage Tüm deney çalışmaya almanız mümkün olmamıştır. Yanlış yöne mi gidiyorum?

cevap

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 =

6

Önce metnin girildiği alt pencereyi bulmanız gerekir. Pencere penceresini "Düzenle" ile çocuk penceresini bularak bunu yapabilirsiniz. Bu pencere tutamacına sahip olduğunuzda, önceden girilmiş olan metni almak için WM_GETTEXT komutunu kullanın, sonra bu metni değiştirin (ör., Kendi adınızı ekleyin), ardından değiştirilmiş metni geri göndermek için WM_SETTEXT kullanın.

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); 
    } 
} 
0x000c
İlgili konular