我正在尝试使用VB .NET自动化外部应用程序。外部应用程序是用VB .NET编写的,并使用win表单。使用Spy ++,我可以编辑文本字段并按下按钮等。但是,我不确定如何从菜单中选择项目。
在应用程序的顶部是一个菜单,它还有子菜单和辅助子菜单,类似于here。 Spy ++将整个菜单条视为一个元素,如果我有菜单条的句柄,我不知道如何选择项目。
到目前为止,我只是通过以下方式自动化应用程序:
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As String) As Integer
也许有一个api用于处理这样的菜单,但我还没有找到它。
希望有人能够启发我:)
答案 0 :(得分:1)
在WinForms中,有两种不同类型的菜单。较旧的MainMenu控件实现了本机Win32样式菜单,您可以使用standard Windows API functions进行操作。较新的MenuStrip控件是一个完全由所有者绘制的菜单栏,用C#编写,旨在模仿2000年代的Microsoft Office应用程序的外观。不幸的是,许多WinForms应用程序使用丑陋的MenuStrip控件,因为它是(A)默认设置,而(B)更容易在菜单项上显示图像。由于MenuStrip是用C#编写的,与本机Win32菜单实现无关,因此您无法使用标准API函数与其进行交互。 Spy ++将它显示为一个控件,实际上是一个黑盒子。
大多数其他WinForms控件,如按钮和文本框,都是本机Win32控件的包装器,因此您可以使用Spy ++查看它们并使用标准Windows API函数与它们进行交互。 (当然,你应该不调用这些函数的ANSI版本,除非你正在编写VB 6应用程序。)
如果您绝对必须操纵其他应用程序的内部,那么您应该使用UI Automation来执行此操作。这适用于真实控件和虚假控件。