如何发送文本到记事本在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在我的所有实验中都能正常工作。 我会走错方向吗?
[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
您首先必须findinput文本的子窗口。 您可以通过查找具有窗口类“编辑”的子窗口来执行此操作。 一旦你有了这个窗口句柄,使用WM_GETTEXT获得已经input的文本,然后修改该文本(例如,添加自己的文本),然后使用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); } }