C#如何在外部程序的文本框中输入文字? 如题,假如我有一个学生信息管理系统的软件,其中有一个窗口是输入学生的个人信息的,包含姓名,年龄,年级等输入框。现在我想要写一个程序去操作输入学生信息窗口的,让那些文本框自动写入信息。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 类似于钩子请搜索"FindWindow SendMessage",或者"FindWindow PostMessage" hWnd = FindWindow(A 程序名字,NULL);SendMessage(hWnd , WM_SETTEXT, (IntPtr)0, "姓名"); http://topic.csdn.net/u/20091112/21/318e7060-ee1e-42bc-8fde-e2b19e45bb48.html//方法声明[DllImport("user32.dll")] static extern int SendMessage(IntPtr Handle, int WParam, int LParam); [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx")] private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam); [DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)] private static extern void SetForegroundWindow(IntPtr hwnd); //单击事件 private void btn_msg_start_Click(object sender, EventArgs e) { try {//启动旺旺客户端程序 System.Diagnostics.Process txt = System.Diagnostics.Process.Start("C:\\Program Files\\Alisoft\\WangWang\\AliIM.exe", @"d:\text_test.txt"); txt.StartInfo.WindowStyle = ProcessWindowStyle.Normal; //等待一秒,以便目标程序notepad.exe输入状态就绪 txt.WaitForInputIdle(1000); //如果目标程序 notepad.exe 没有停止响应,则继续 if (txt.Responding) { SearchWindow(); } } catch { } } const int WM_GETTEXT = 0x000D; const int WM_SETTEXT = 0x000C; const int WM_CLICK = 0x00F5; private int SearchWindow() { int retval = 0; //增加一个返回值用来判断操作是否成功 //下面的这些参数都可以用Spy++查到 string lpszParentClass = "StandardWindow"; //整个窗口的类名 string lpszParentWindow = "登录窗口"; //窗口标题 string lpszClass = "EditComponent"; //需要查找的子窗口的类名,也就是用户名输入框 string lppassword = "ATL:Edit";//密码输入框 string lpszClass_Submit = "StandardButton"; //需要查找的Button的类名 string lpszName_Submit = "登 录"; ///需要查找的Button的标题 IntPtr ParenthWnd = new IntPtr(0); IntPtr EdithWnd = new IntPtr(0); //查到窗体,得到整个窗体 ParenthWnd = FindWindow(lpszParentClass,lpszParentWindow); //判断这个窗体是否有效 if (!ParenthWnd.Equals(IntPtr.Zero)) { //得到User Name这个子窗体,并设置其内容 EdithWnd = FindWindowEx(ParenthWnd,EdithWnd,lpszClass,""); if (!EdithWnd.Equals(IntPtr.Zero)) { //调用SendMessage方法设置其内容 SendMessage(EdithWnd, WM_SETTEXT, (IntPtr)0, "sdfsdfd"); retval ++; } //得到Password这个子窗体,并设置其内容 EdithWnd = FindWindowEx(ParenthWnd, EdithWnd,lppassword, ""); if (!EdithWnd.Equals(IntPtr.Zero)) { SendMessage(EdithWnd, WM_SETTEXT, (IntPtr)0, "sdfsdsdfsdasdfd"); retval ++; } //得到Button这个子窗体,并触发它的Click事件 EdithWnd = FindWindowEx(ParenthWnd,EdithWnd, lpszClass_Submit, lpszName_Submit); if (!EdithWnd.Equals(IntPtr.Zero)) { SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0"); retval++; } } return retval; } RowCommand 中DataItem的问题 winform动态创建Label问题 以上补充程序: 如何捕获应用程序的句柄? C# 如果用委托实现C++中的函数指针功能? C# oledbdatareader如何通过编号读取数据库的特定列元素值 C#中,如何在同一个form里面,绘制不同速率的移动的图形? Time problem on .NET Micro Framework 正则表达式与中文 关于新建项目 请问如何得到继承SoapHttpClientProtocol类中xml的内容? C# 关于UDP点对点通讯的问题
SendMessage(hWnd , WM_SETTEXT, (IntPtr)0, "姓名");
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr Handle, int WParam, int LParam); [DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)]
private static extern void SetForegroundWindow(IntPtr hwnd); //单击事件
private void btn_msg_start_Click(object sender, EventArgs e)
{
try
{//启动旺旺客户端程序
System.Diagnostics.Process txt = System.Diagnostics.Process.Start("C:\\Program Files\\Alisoft\\WangWang\\AliIM.exe", @"d:\text_test.txt");
txt.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
//等待一秒,以便目标程序notepad.exe输入状态就绪
txt.WaitForInputIdle(1000);
//如果目标程序 notepad.exe 没有停止响应,则继续
if (txt.Responding)
{
SearchWindow();
}
}
catch { }
}
const int WM_GETTEXT = 0x000D;
const int WM_SETTEXT = 0x000C;
const int WM_CLICK = 0x00F5;
private int SearchWindow()
{
int retval = 0; //增加一个返回值用来判断操作是否成功
//下面的这些参数都可以用Spy++查到
string lpszParentClass = "StandardWindow"; //整个窗口的类名
string lpszParentWindow = "登录窗口"; //窗口标题
string lpszClass = "EditComponent"; //需要查找的子窗口的类名,也就是用户名输入框
string lppassword = "ATL:Edit";//密码输入框
string lpszClass_Submit = "StandardButton"; //需要查找的Button的类名
string lpszName_Submit = "登 录"; ///需要查找的Button的标题
IntPtr ParenthWnd = new IntPtr(0);
IntPtr EdithWnd = new IntPtr(0);
//查到窗体,得到整个窗体
ParenthWnd = FindWindow(lpszParentClass,lpszParentWindow);
//判断这个窗体是否有效
if (!ParenthWnd.Equals(IntPtr.Zero))
{
//得到User Name这个子窗体,并设置其内容
EdithWnd = FindWindowEx(ParenthWnd,EdithWnd,lpszClass,"");
if (!EdithWnd.Equals(IntPtr.Zero))
{
//调用SendMessage方法设置其内容
SendMessage(EdithWnd, WM_SETTEXT, (IntPtr)0, "sdfsdfd");
retval ++;
}
//得到Password这个子窗体,并设置其内容 EdithWnd = FindWindowEx(ParenthWnd, EdithWnd,lppassword, "");
if (!EdithWnd.Equals(IntPtr.Zero))
{
SendMessage(EdithWnd, WM_SETTEXT, (IntPtr)0, "sdfsdsdfsdasdfd");
retval ++;
}
//得到Button这个子窗体,并触发它的Click事件
EdithWnd = FindWindowEx(ParenthWnd,EdithWnd, lpszClass_Submit, lpszName_Submit);
if (!EdithWnd.Equals(IntPtr.Zero))
{
SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0");
retval++;
}
} return retval;
}