4

I am working on a application, which would be the face of lot of other tools running in background. I am facing an issue. During the launch of a background application ,it needs to load a specific file(file-->load--> file name).

Let the front end application be Fapp and the background application be Bapp. Is it possible for Fapp to get the handle of Bapp's menu item and trigger the load function. I am able to get the handle for buttons but not able to do the same for menu items.

Now we are achieving this using AutoIt, I am trying to achieve this in C# itself.

4

3 回答 3

2

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

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

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

于 2013-05-07T12:33:15.777 回答
0

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

如果您没有 BApp 的源代码,并且它也没有您可以使用的 API,那么假装是交互式用户可能是与之交互的唯一方式。请注意它充满了问题,考虑一下什么时候会发生

  • BApp 尚未运行
  • BApp 打开了一个模态对话框
  • BApp 处于操作中(或挂起)并且其菜单被禁用
  • BApp 更新到新版本,UI 发生变化
  • 交互式用户在操作过程中改变焦点。

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

事实上,只需在 BApp 应用程序中添加一个自托管的 WCF 连接,这样就可以在外部调用它,这很容易。

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

然后,这将使您能够让两者完全独立地交谈。

于 2013-05-08T10:52:08.777 回答
0

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

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

于 2013-05-12T20:43:50.180 回答