2009-02-07 77 views
24

我正在嘗試使用SendMessage來記事本,這樣我就可以插入書面文本而不使記事本成爲活動窗口。如何發送文本到C#/ Win32中的記事本?

我在過去使用SendText做過這樣的事情,但那需要記事本的重點。

現在,首先我取回的Windows句柄:

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

我已經證實了它的記事本的右手柄,內Windows Task Manager顯示的相同。

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

從這裏,我一直沒有能夠得到SendMessage在我的所有實驗中工作。我會走錯方向嗎?

回答

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

您首先必須找到輸入文本的子窗口。您可以通過查找具有窗口類「編輯」的子窗口來執行此操作。 一旦你有了這個窗口句柄,使用WM_GETTEXT獲取已經輸入的文本,然後修改該文本(例如,添加你自己的文本),然後使用WM_SETTEXT發送修改後的文本。

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); 
    } 
} 
相關問題