如何在C#/ Win32中将文本发送到记事本?

时间:2009-02-07 07:50:03

标签: c# winapi

我正在尝试将SendMessage用于记事本,这样我就可以在不将记事本作为活动窗口的情况下插入书面文本。

我过去使用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在我的所有实验中发挥作用。我的方向是错误的吗?

3 个答案:

答案 0 :(得分:43)

    [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

答案 1 :(得分:6)

首先必须找到输入文本的子窗口。您可以通过查找窗口类“编辑”的子窗口来完成此操作。 获得该窗口句柄后,使用WM_GETTEXT获取已输入的文本,然后修改该文本(例如,添加自己的文本),然后使用WM_SETTEXT将修改后的文本发回。

答案 2 :(得分:1)

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