有这样一个需求,老板他不会在乎你的软件是怎么产生的,他只在乎,你给客户就必须交付一套好点的可操作性行的操作客户端
来需要打印机打印一个套表数据,简单嘛,网上随便找个套表工具或者插件就行了咩。
你不知道我就要告诉你知道,人家开发好的软件凭什么免费给你使用,尤其是这种带有些许商业性质的功能,比如报表,套表,可以给你免费,加个弹框Log没什么问题吧。
所以你就开始对比各种软件,总能找到一款你想要的,然后也总能遇到各种问题。
好吧我比较懒对比了十几二十套插件只有找到了一款还算不错的
ReportMachine就是它了。我不清楚别人免费东西有多好,反正我觉得它就是我的真名天子就是了。
然后就算找了官方想要和作者也没找到一个最新免费又不带免费提示的。总是会弹出 【正在准备报表】的按钮,需要手工点击才可打印。
本着懒人的目标,不让客户去手工点击,我就想那就模拟点击吧
于是就随便找了几句代码扔了进去,然后就那个不为人知的界面给去掉了。
当然你得操作一个线程,不停的再后台处理
#region DllImport
/// <summary>
/// 找到窗口
/// </summary>
/// <param name="lpClassName">窗口类名(例:Button)</param>
/// <param name="lpWindowName">窗口标题</param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
/// <summary>
/// 找到窗口
/// </summary>
/// <param name="hwndParent">父窗口句柄(如果为空,则为桌面窗口)</param>
/// <param name="hwndChildAfter">子窗口句柄(从该子窗口之后查找)</param>
/// <param name="lpszClass">窗口类名(例:Button</param>
/// <param name="lpszWindow">窗口标题</param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
/// <summary>
/// 发送消息
/// </summary>
/// <param name="hwnd">消息接受窗口句柄</param>
/// <param name="wMsg">消息</param>
/// <param name="wParam">指定附加的消息特定信息</param>
/// <param name="lParam">指定附加的消息特定信息</param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);
//窗口发送给按钮控件的消息,让按钮执行点击操作,可以模拟按钮点击
private const int BM_CLICK = 0xF5;
#endregion
/// <summary>
/// 模拟关闭弹框提示
/// </summary>
void CloseFree()
{
IntPtr hWnd = FindWindow(null, "免费版本");
IntPtr SWnd = FindWindow(null, "正在准备报表");
if (hWnd != IntPtr.Zero && SWnd != IntPtr.Zero)
{
IntPtr childHwnd = FindWindowEx(hWnd, IntPtr.Zero, null, "OK");//按钮控件标题
if (childHwnd != IntPtr.Zero)
{
SendMessage(childHwnd, BM_CLICK, 0, 0);
}
}
}