我正在开发一个应用程序,这将是许多其他工具在后台运行的表面。我正面临一个问题。在启动后台应用程序期间,它需要加载特定文件(文件 - >加载 - >文件名)。
让前端应用程序为Fapp
,后台应用程序为Bapp
。 Fapp
是否可以获取Bapp's
菜单项的句柄并触发加载功能。我能够获得按钮的句柄,但不能对菜单项执行相同的操作。
现在我们正在使用AutoIt实现这一目标,我试图在C#中实现这一点。
答案 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,那么伪装成交互式用户可能是与其进行交互的唯一方式。请注意,它充满了问题,请考虑
时会发生什么替代方法是执行与使用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中,您处理此消息并采取适当的措施。
我不认为获取控件的句柄并调用其处理程序是正确的方法。