Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从C语言中的应用程序获取后台运行的应用程序菜单项的句柄#_C#_Automation - Fatal编程技术网

C# 如何从C语言中的应用程序获取后台运行的应用程序菜单项的句柄#

C# 如何从C语言中的应用程序获取后台运行的应用程序菜单项的句柄#,c#,automation,C#,Automation,我正在开发一个应用程序,它将是在后台运行的许多其他工具的界面。我面临一个问题。在启动后台应用程序期间,它需要加载特定文件(文件-->加载-->文件名) 让前端应用程序为Fapp,后台应用程序为Bapp。Fapp是否可以获取Bapp菜单项的句柄并触发加载功能。我能得到按钮的手柄,但不能得到菜单项的手柄 现在我们使用AutoIt来实现这一点,我尝试在C#本身中实现这一点。在获得要调用其菜单的窗口句柄后,您可以使用 humenu GetMenu(HWND)windowsapi获取菜单 humenu

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

让前端应用程序为
Fapp
,后台应用程序为
Bapp
Fapp
是否可以获取
Bapp
菜单项的句柄并触发加载功能。我能得到按钮的手柄,但不能得到菜单项的手柄


现在我们使用AutoIt来实现这一点,我尝试在C#本身中实现这一点。

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

  • humenu GetMenu(HWND)
    windowsapi获取菜单
  • humenu GetSubMenu(humenu,int)
    进入文件菜单,然后再次打开菜单
  • BOOL GetMenuItemInfo(…)
    获取有关菜单的信息
  • 您可以使用
    PostMessage((IntPtr)hWnd,WM_命令,0,ID_菜单项)()以在该项目上执行单击

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

您确定这是让两个应用程序相互对话的正确方法吗

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

这将使您能够让两人完全独立地交谈。

如果您的Bapp能够以某种方式调用Win32 API,则可以通过使用向Fapp发送自定义消息来实现。在Fapp中,处理此消息并采取适当的操作


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

检查菜单项的访问修饰符….“工具”是否等于“过程”?如果是这样的话,您是否阅读过.NET中有关进程间通信(IPC)的内容?否则,“工具”是什么意思?我所说的“工具”是指另一个应用程序,不一定是.net应用程序,比如用python开发的可执行文件。@andy。我没有我正在尝试获取句柄的应用程序的代码。我不会将此标记为WPF问题,因为您的问题是对另一个似乎不基于WPF的应用程序进行“反向工程”。您可能需要了解有关Bapp实现的更多信息,以搜索能够深入了解它的工具。老鼠!刚刚发现你不是在说两个WPF应用。