Как отправить текст в блокнот в C # / Win32? - PullRequest
29 голосов
/ 07 февраля 2009

Я пытаюсь использовать 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 ]

43 голосов
/ 07 февраля 2009
    [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 голосов
/ 07 февраля 2009

Сначала вы должны найти дочернее окно, в которое вводится текст. Вы можете сделать это, найдя дочернее окно с классом окна «Редактировать». Когда у вас есть этот дескриптор окна, используйте WM_GETTEXT, чтобы получить уже введенный текст, затем измените этот текст (например, добавьте свой собственный), затем используйте WM_SETTEXT, чтобы отправить измененный текст обратно.

1 голос
/ 21 января 2017
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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...