在一个winform程序上有2个 TextBox 和1个Button
我有个xml,要求做个程序自动把xml上的数据对应写入到winform的TextBox上,然后点Button 。
取出xml上的数据我都可以搞定,现在问题是如何把取到的值填到winform的TextBox上?
(winform是一个.exe运行程序,没有源码)
请教大家帮忙看看,谢谢!
我有个xml,要求做个程序自动把xml上的数据对应写入到winform的TextBox上,然后点Button 。
取出xml上的数据我都可以搞定,现在问题是如何把取到的值填到winform的TextBox上?
(winform是一个.exe运行程序,没有源码)
请教大家帮忙看看,谢谢!
1、找一个spy++(「开始」菜单\程序\Microsoft Visual Studio 2005\Visual Studio Tools)或者类似的工具(推荐老妖写的spy4win用起来比较简单功能也多)2、使用spy++分析TextBox(其他语言可能叫:Edit、TMemo、TEdit...)所在的Form(没有容器parent的窗体)类名和标题名3、获得类名和窗体标题,就可以通过FindWindow()API函数获得该窗体句柄。
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
比如:FindWindow("Notepad", "无标题 - 记事本")4、遍历子窗体,将所以子窗体的类名、句柄、标题输出分析。
public delegate bool WNDENUMPROC(IntPtr hwnd, int lParam);[DllImport("user32.dll")]
public static extern int EnumChildWindows(IntPtr hWndParent,
WNDENUMPROC lpEnumFunc, int lParam);
public bool EnumChild(IntPtr hwnd, int lParam)
{
StringBuilder vClassName = new StringBuilder(256);
GetClassName(hwnd, vClassName, vClassName.Capacity);
StringBuilder vWindowText = new StringBuilder(256);
GetWindowText(hwnd, vWindowText, vWindowText.Capacity);
Console.WriteLine("句柄:{0} 类名:{1} 标题:{2}", hwnd, vClassName, vWindowText);
return true;
}EnumChildWindows(vHandle, EnumChild, 0);
5、用spy++工具获得textBox的句柄,根据4的打印的结果分析前后类名和标题是否有恒定的,可以作为参照点。6、更新参照点找到输入框的句柄
假设类名:"Button" 标题:"About"后面第二个是输入框,可以这样写
int index = -1; // 参照点开始的序号
IntPtr edit = IntPtr.Zero;public bool EnumChild(IntPtr hwnd, int lParam)
{
StringBuilder vClassName = new StringBuilder(256);
GetClassName(hwnd, vClassName, vClassName.Capacity);
StringBuilder vWindowText = new StringBuilder(256);
GetWindowText(hwnd, vWindowText, vWindowText.Capacity);
if (index < 0)
{
if (vClassName.ToString() == "Button" &&
vWindowText.ToString() == "About")
index = 0;
}
else
{
index++;
if (index == 2)
{
edit = hwnd;
return false; // 停止遍历
}
}
return true;
}7、获得输入框的句柄就是填写内容了,用WM_SETTEXT消息 //具体数值可以搜索本地文件包含“WM_SETTEXT”的头文件(*.h)
[DllImport("User32.DLL")]
public static extern int SendMessage(IntPtr hWnd,
uint Msg, int wParam, string lParam);
public const uint WM_SETTEXT = 0x000C;SendMessage(edit, WM_SETTEXT, 0, "Zswang 路过");
例如可以在WINFORM的文件目录下创建个inf文件,直接将值写入里边,运行完WINFORM就清空;或者是把那个值暂存入注册表某项中,待用时再取出使用。
只附写注册表的代码,如我想要写入到:HKEY_USERS\.DEFAULT\Console\Registry.SetValue("HKEY_USERS\\.DEFAULT\\Console", "value", "0");//SetValue("注册表根值","键名","键值")
string Value=Registry.GetValue("HKEY_USERS\\.DEFAULT\\Console\\browse", "admin", "false");