C# api调用怎么获得窗体内容?

fxmaster01 2010-01-31 10:05:08
如题
...全文
215 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyblusea 2010-01-31
  • 打赏
  • 举报
回复
上面代码来到http://www.diybl.com/course/3_program/vc/vc_js/20090727/168175.html

用于:获取另一程序控件,改变值,触发事件
hyblusea 2010-01-31
  • 打赏
  • 举报
回复

[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);
const int WM_GETTEXT = 0x000D;
const int WM_SETTEXT = 0x000C;
const int WM_CLICK = 0x00F5;
private void button3_Click(object sender, EventArgs e)
{
int retval = 0; //增加一个返回值用来判断操作是否成功
//下面的这些参数都可以用Spy++查到
//string lpszParentClass = "#32770"; //整个窗口的类名
string lpszParentWindow = "Form1"; //窗口标题
string lpszClass = "WindowsForms10.EDIT.app.0.b7ab7b"; //需要查找的子窗口的类名,也就是输入框
string lpszClass_Submit = "WindowsForms10.BUTTON.app.0.b7ab7b"; //需要查找的Button的类名
string lpszName_Submit = "确定"; //需要查找的Button的标题
string text = "";
IntPtr ParenthWnd = new IntPtr(0);
IntPtr EdithWnd = new IntPtr(0);
//查到窗体,得到整个窗体
ParenthWnd = FindWindow(null, lpszParentWindow);
//判断这个窗体是否有效
if (!ParenthWnd.Equals(IntPtr.Zero))
{
//得到User Name这个子窗体,并设置其内容
EdithWnd = FindWindowEx(ParenthWnd, EdithWnd, lpszClass, "");
if (!EdithWnd.Equals(IntPtr.Zero))
{
text = "Book";
//调用SendMessage方法设置其内容
SendMessage(EdithWnd, WM_SETTEXT, (IntPtr)0, text);
retval++;
}
//得到Password这个子窗体,并设置其内容
EdithWnd = FindWindowEx(ParenthWnd, EdithWnd, lpszClass, "");
if (!EdithWnd.Equals(IntPtr.Zero))
{
text = "ITest";
SendMessage(EdithWnd, WM_SETTEXT, (IntPtr)0, text);
retval++;
}
//得到Domain这个子窗体,并设置其内容
EdithWnd = FindWindowEx(ParenthWnd, EdithWnd, lpszClass, "");
if (!EdithWnd.Equals(IntPtr.Zero))
{
text = "Ilove";
SendMessage(EdithWnd, WM_SETTEXT, (IntPtr)0, text);
retval++;
}
//得到Button这个子窗体,并触发它的Click事件
EdithWnd = FindWindowEx(ParenthWnd,
(IntPtr)0, lpszClass_Submit, lpszName_Submit);
if (!EdithWnd.Equals(IntPtr.Zero))
{
SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0");
retval++;
}
}
TTOJJ 2010-01-31
  • 打赏
  • 举报
回复
findwindows获得句柄,获得文本内容可以遍历其控件
zhouxingyu896 2010-01-31
  • 打赏
  • 举报
回复
支持三楼的

通过Spy++获得窗体句柄
再通过发送消息的方式获得

这个功能还不如用VC++写



fxmaster01 2010-01-31
  • 打赏
  • 举报
回复
private string GetWindowText(int handle)
{
int ptrRet;

try
{
//int length = GetWindowTextLength(new IntPtr(handle));

//GetWindowText(handle, stringBuilder, stringBuilder.Capacity);
//string strTitle = stringBuilder.ToString();

int intSize = SendMessage(handle, WM_GETTEXTLENGTH, 0, 0);
// StringBuilder stringBuilder = new StringBuilder(length + 1);


// int intSize = SendMessageInt(new IntPtr(handle), WM_GETTEXTLENGTH, IntPtr.Zero, 0);
StringBuilder stringBuilder = new StringBuilder(intSize);
ptrRet = SendMessageString(handle, WM_GETTEXT, intSize + 1, stringBuilder);

return stringBuilder.ToString();


}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());

return "";
}
}


private void timer1_Tick(object sender, EventArgs e)
{
IntPtr ptrDialogWindow = FindWindow(null, "Microsoft Internet Explorer");

//List<FromInfo> fromInfo = GetAlert.GetHandleList(ptrDialogWindow.ToInt32());

//foreach (FromInfo ptrHandle in fromInfo)
//{
// string str = GetWindowText(ptrHandle.Handle);


// if (str != "")
// {
// textBox1.Text = str;
// //CloseWindow((IntPtr)ptrDialogWindow);
// //DestroyWindow((IntPtr)ptrDialogWindow);
// SendMessage(ptrDialogWindow.ToInt32(), WM_CLOSE, 0, 0);


// }
//}


string str = GetWindowText(ptrDialogWindow.ToInt32());

if (str != "")
{
textBox1.Text = str;
//CloseWindow((IntPtr)ptrDialogWindow);
//DestroyWindow((IntPtr)ptrDialogWindow);
SendMessage(ptrDialogWindow.ToInt32(), WM_CLOSE, 0, 0);

}

}
我发现 如果将textbox1的句柄传入可以得到它的内容,但我把窗体传入却得不到窗体的值;
主要向得到alert的内容

ouc_ajax 2010-01-31
  • 打赏
  • 举报
回复
你用的是向目标窗口发消息的方式吧?
把代码写全贴出来, 注释去掉吧....
fxmaster01 2010-01-31
  • 打赏
  • 举报
回复
/int length = GetWindowTextLength(new IntPtr(handle));

//GetWindowText(handle, stringBuilder, stringBuilder.Capacity);
//string strTitle = stringBuilder.ToString();

int intSize = SendMessage(handle, WM_GETTEXTLENGTH, 0, 0);
// StringBuilder stringBuilder = new StringBuilder(length + 1);


// int intSize = SendMessageInt(new IntPtr(handle), WM_GETTEXTLENGTH, IntPtr.Zero, 0);
StringBuilder stringBuilder = new StringBuilder(intSize);

ptrRet = SendMessageString(handle, WM_GETTEXT, intSize, stringBuilder);


textBox1.Text = intSize.ToString();
return stringBuilder.ToString();

我写的,可怎么得到都是窗体标题,请指点一二~
hyblusea 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fxmaster01 的回复:]
引用 3 楼 wuyq11 的回复:

我是想获得文本内容, findwindow 好像没有吧?
[/Quote]

一个文本框,仍然是一个特殊的窗体,所以你是可以使用FindWindow,或FindWindowEX找到你的文本框,然后再获取他里面内容.就这样简单.
fxmaster01 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyq11 的回复:]
[DllImport ( "user32.dll", EntryPoint = "FindWindow", SetLastError = true )]
private static extern IntPtr FindWindow( string lpClassName, string lpWindowName );

[DllImport ( "user32.dll", EntryPoint = "FindWindowEx", SetLastError = true )]
private static extern IntPtr FindWindowEx( IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow );


IntPtr hWnd1 = FindWindow(null, "主窗口标题");                       
IntPtr hWnd2 = FindWindowEx(hWnd1, IntPtr.Zero, null, "控件文本"); 
IntPtr hWnd3 = FindWindowEx(hWnd1, IntPtr.Zero, "控件类名", null); 

IntPtr h= FindWindow ( null, "" );
if ( h!= IntPtr.Zero )
{
IntPtr h2= FindWindowEx(h, 0, null, "3" );
IntPtr ParenthWnd = FindWindow(null, "");
}

[/Quote]
我是想获得文本内容, findwindow 好像没有吧?
wuyq11 2010-01-31
  • 打赏
  • 举报
回复
[DllImport ( "user32.dll", EntryPoint = "FindWindow", SetLastError = true )]
private static extern IntPtr FindWindow( string lpClassName, string lpWindowName );

[DllImport ( "user32.dll", EntryPoint = "FindWindowEx", SetLastError = true )]
private static extern IntPtr FindWindowEx( IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow );


IntPtr hWnd1 = FindWindow(null, "主窗口标题");
IntPtr hWnd2 = FindWindowEx(hWnd1, IntPtr.Zero, null, "控件文本");
IntPtr hWnd3 = FindWindowEx(hWnd1, IntPtr.Zero, "控件类名", null);

IntPtr h= FindWindow ( null, "" );
if ( h!= IntPtr.Zero )
{
IntPtr h2= FindWindowEx(h, 0, null, "3" );
IntPtr ParenthWnd = FindWindow(null, "");
}
fxmaster01 2010-01-31
  • 打赏
  • 举报
回复
获得窗体内容
小在在 2010-01-31
  • 打赏
  • 举报
回复
什么意思,想获得什么效果?

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧