Как отправить текст в блокнот в C#/Win32?
Я пытаюсь использовать 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 ответа
[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
Сначала вы должны найти дочернее окно, где вводится текст. Вы можете сделать это, найдя дочернее окно с классом окна "Редактировать". Когда у вас есть этот дескриптор окна, используйте WM_GETTEXT, чтобы получить текст, который уже введен, затем измените этот текст (например, добавьте свой собственный), затем используйте WM_SETTEXT, чтобы отправить измененный текст обратно.
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);
}
}