繁体   English   中英

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

[英]How to get handle for menu items of an application running in the back ground from an application in C#

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

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

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

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

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

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

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

如果您没有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();

这将使您能够完全独立地进行两个谈话。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM