背景:启动第三方登录程序,并补全账号和密码消息;
工具:spy++,获取第三方登录窗体的句柄、标题等;
引用API:
- //根据窗体名称获取窗体
[DllImport("user32.dll", EntryPoint = "FindWindow")]
public extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
- //查找窗口内控件句柄
[DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
- //发送消息
[DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);
- //枚举子窗体
[DllImport("user32.dll")]
public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam);
public delegate bool CallBack(IntPtr hwnd, int lParam);
实现思路:
1、启动第三方程序,获取到登录窗体的句柄;
2、通过spy++工具查找到账号和密码输入框、登录按钮的类、标题等信息;
3、调用API里面的FindWindowEx方法查找到输入框或按钮的句柄;
主窗体获取不到的时候,可以通过调用方法EnumChildWindows枚举子窗体继续查找;
4、调用SendMessage方法发送消息;
发送字符串消息:for (int i = 0; i < ch.Length; i++)
{
SendMessage(passwd, 0X102, ch[i], 0);
}
发送按钮消息:SendMessage(loginbutton, 0xF5, 0, 0);
结果:完成!