如何从C#中的应用程序处理在后台运行的应用程序的菜单项

时间:2013-04-29 05:05:00

标签: c# automation

我正在开发一个应用程序,这将是许多其他工具在后台运行的表面。我正面临一个问题。在启动后台应用程序期间,它需要加载特定文件(文件 - >加载 - >文件名)。

让前端应用程序为Fapp,后台应用程序为BappFapp是否可以获取Bapp's菜单项的句柄并触发加载功能。我能够获得按钮的句柄,但不能对菜单项执行相同的操作。

现在我们正在使用AutoIt实现这一目标,我试图在C#中实现这一点。

3 个答案:

答案 0 :(得分:1)

获得要调用其菜单的窗口句柄后,可以使用

  • HMENU GetMenu(HWND) windows api获取菜单
  • HMENU GetSubMenu(HMENU, int)进入文件菜单并再次打开菜单。
  • BOOL GetMenuItemInfo( ... )获取有关菜单的信息
  • 您可以使用PostMessage((IntPtr)hWnd, WM_COMMAND, 0, ID_MENU_ITEM);related post)点击该项目。

所有这些api都是AutoIt所调用的(我认为)。如果您的Bapp是具有普通Windows菜单的普通Windows应用程序,而不是花哨的WPF应用程序或功能区,则此解决方案有效。如果是这种情况,那么您所看到的菜单可能不是菜单(技术上无论如何)

答案 1 :(得分:0)

您确定这是让两个应用程序相互通信的正确方法吗?

如果您没有BApp的源代码,并且它也没有可以使用的API,那么伪装成交互式用户可能是与其进行交互的唯一方式。请注意,它充满了问题,请考虑

时会发生什么
  • BApp尚未运行
  • BApp打开了一个模态对话框
  • BApp处于操作(或挂起)的中间且其菜单已禁用
  • BApp已更新为新版本及其UI更改
  • 交互式用户在操作过程中更改焦点。

替代方法是执行与使用UI对应用程序进行单元测试时所执行的操作相同的操作。这是因为您正在做同样的事情,通过执行执行其功能的调用来自动化应用程序,在这种情况下,测试结果是按预期的。由于这是WPF帖子,我们假设您正在使用MVVM编写应用程序,并且最好的方法(在我们更改UI时避免脆弱)是忽略UI(View)并调用位于其下的层,即VM (视图模型)。

事实上,在BApp应用程序中添加自托管WCF连接非常简单,以便可以在外部调用它。

        this._host = new ServiceHost(service);
        this._host.AddServiceEndpoint(typeof(IContract), new NetTcpBinding(), address);
        this._host.Open();

这样就可以让你完全独立地进行两次谈话。

答案 2 :(得分:0)

如果你的Bapp能够以某种方式调用Win32 API - 那么这可以通过向你的Fapp发送自定义WM_USER消息来实现 - 使用SendMessage()。在您的Fapp中,您处理此消息并采取适当的措施。

我不认为获取控件的句柄并调用其处理程序是正确的方法。