有没有办法从我无法控制的程序中获取信息?

时间:2012-04-11 17:44:13

标签: c# .net

目前正在运行此代码以打开Business Vision(由其他人编写的应用程序,我无权访问该代码):

ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(BusinessVisionPath);
myProcessStartInfo.UseShellExecute = false;
myProcessStartInfo.RedirectStandardOutput = true;
myProcess.StartInfo = myProcessStartInfo;
myProcess.Start();

StreamReader myStreamReader = myProcess.StandardOutput;
Boolean done = false;
while (done == false)
{
    int s = myStreamReader.Read();
    Console.WriteLine(s);
    if (s == -1)
    {
        done = true;
        Process IProcess = new Process();
        ProcessStartInfo IProcessStartInfo = new ProcessStartInfo(QuickPrinterPath);
        IProcessStartInfo.WindowStyle = ProcessWindowStyle.Maximized;
        IProcess.StartInfo = IProcessStartInfo;
        IProcess.Start();
    }

}
myProcess.Close();
Console.ReadLine();

反正

当BusinessVision关闭时,此代码当前打开我的打印机程序。

问题

  1. 如果(如果可能的话)我可以在BV内弹出某个消息框时打开我的程序(“你确定要打印发票吗?”)。
  2. 是否可以从应用程序获取任何数据?就像我可以在运行时解析的原始数据一样?

5 个答案:

答案 0 :(得分:1)

您可能希望了解Microsoft的UI自动化。它允许您从其他应用程序的窗口读取数据,并以编程方式与其他应用程序的UI交互。几年前我用这个来自动化我们拥有的旧VB6应用程序上的一堆测试。我的代码将找到应用程序的主窗口,然后深入查看我感兴趣的菜单/控件/等。从那里我可以自动执行点击和击键,然后从各种标签中抓取我想要的文本/数据视窗。然后,我可以将数据拉入我的.NET应用程序并使用它做我想做的事。

在您的情况下,您需要一些始终运行的应用程序(例如Windows服务)来持续监控BV程序并检测消息框何时出现,然后通过启动您的程序做出相应的反应。

理解并开始工作需要相当多的工作,但它非常强大。有免费的应用程序可以更容易地浏览窗口的可视化层次结构,并查看可用的信息类型。看看微软的UISpy:

http://msdn.microsoft.com/en-us/library/ms727247.aspx

以下是一些其他可以帮助您入门的链接:

http://en.wikipedia.org/wiki/Microsoft_UI_Automation

http://msdn.microsoft.com/en-us/library/ms747327.aspx

答案 1 :(得分:1)

您可以尝试使用其中一种获批准的方式来访问数据。

在Sage BusinessVision的案例中,有:

  1. 数据导入和导出为应用程序中可用的csv。
  2. 在名为 BusinessVision数据库结构Reference.chm
  3. 的文件中直接访问Pervasive数据库,该文档可在应用程序的帮助部分中找到。
  4. API可供Sage合作伙伴使用。
  5. 1是最简单的方法,没有什么是自动的 2更具挑战性,但可以让您直接访问基础数据 3要求您支付并且您满足Sage的要求。

    如果你结合使用2.和一些UI自动化,你可以在某些UI事件上构建一些触发器,并带来充满数据库数据的新窗口。

    请注意,UI自动化对于新版本的应用程序来说极其脆弱,并且每次都需要重新设计。

答案 2 :(得分:0)

  1. 你可以,虽然我不确定我会推荐它,Enumerate top level windows,并检查其中一个是否与弹出框匹配。
  2. 除了您希望进入应用程序的Binary Patching之外,应用程序创建的文件或数据库条目,不是我所知道的。

答案 3 :(得分:0)

如果目标是.NET exe,那么开发人员可能会草率地公开他们的类和方法。在这种情况下,加载exe就好像它是应用程序的DLL依赖项并直接调用它们的方法。

答案 4 :(得分:0)

你总是可以试试反编译器:) dotPeek