VBA向外部程序发送API调用

VBA向外部程序发送API调用,vba,excel,Vba,Excel,我是个新手,一直在摸索着创建一个excel文档,与我们的一个外部应用程序进行通信 我已经学习了使用FindWindowEX查找此应用程序的特定按钮/框的教程,并成功地将文本插入其中一个表单中 我在尝试“单击”按钮时遇到了一个障碍,我认为问题在于我尝试与之通信的应用程序没有唯一的类名 从图中你可以看到几乎所有的东西都被称为“WindowsForms10.Window.8.app.0.2004eee” 这意味着我可以将文本插入到第一个也是唯一的文本框中,但不能再深入下去,以获得我需要“单击”以进行

我是个新手,一直在摸索着创建一个excel文档,与我们的一个外部应用程序进行通信

我已经学习了使用FindWindowEX查找此应用程序的特定按钮/框的教程,并成功地将文本插入其中一个表单中

我在尝试“单击”按钮时遇到了一个障碍,我认为问题在于我尝试与之通信的应用程序没有唯一的类名


从图中你可以看到几乎所有的东西都被称为“WindowsForms10.Window.8.app.0.2004eee”

这意味着我可以将文本插入到第一个也是唯一的文本框中,但不能再深入下去,以获得我需要“单击”以进行搜索的按钮

当前的代码如下:我不需要打开应用程序,因为它总是在启动时启动的

Sub Runapplication()


DoEvents
Hwindow2 = FindWindow(vbNullString, "General Account Enquiry")


'Account Number
Account_Number = FindWindowEx(Hwindow2, 0&, "WindowsForms10.EDIT.app.0.2004eee", vbNullString)
Accountnumber = ThisWorkbook.Sheets("Sheet1").Range("A1")

Call SendMessageByString(Account_Number, WM_SETTEXT, 0, Accountnumber)


DoEvents


Account1 = FindWindow(vbNullString, "csEditAccount")
Account = FindWindowEx(Hwindow2, 0&, "WindowsForms10.Window.8.app.0.2004eee", vbNullString)

'Call EnableWindow(Account, True)
Call SendMessage(Account, WM_LBUTTONDOWN, 0, ByVal 0&)


End Sub
我有所有的常数/定义

Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
            ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare PtrSafe Function CloseWindow Lib "user32" (ByVal hWnd As Long) As Long

Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _
            ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
            lParam As Any) As Long

Public Declare PtrSafe Function SendMessageByString Lib "user32" Alias "SendMessageA" ( _
            ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
            ByVal lParam As String) As Long

 Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
            ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
            ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long


Public Declare PtrSafe Function FindWindowEx Lib "user32" _
            Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
            ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Public Declare PtrSafe Function EnableWindow Lib "USER32.dll" ( _
            ByVal hWnd As Long, _
            ByVal fEnable As Long) As Long


            Public Const SW_NORMAL As Long = 1
            Public Const WM_CLOSE As Long = &H10
            Public Const BM_CLICK As Long = &HF5
            Public Const WM_KEYUP As Long = &H101
            Public Const WM_SETTEXT = &HC
            Public Const LB_FINDSTRING = &H18F
            Public Const WM_LBUTTONDOWN = &H201
如果有任何帮助,我将不胜感激。昨天我在网上搜索这个问题的答案时差点发疯


谢谢大家!

虽然我同情许多窗口都具有相同的类,但您要操作的窗口(模拟单击)并非总是按顺序出现在相同的位置。所以,如果你想按第三个按钮,那么它不总是第三个按钮吗。即使按钮与文本框具有相同的类别,因此实际上您想要的是按钮和文本框超集中的第8个,那么它仍然将始终是第8个


因此,只需枚举(使用EnumChildWindows),直到找到目标。

EnumChildWindows可能会有所帮助,但图像中的可用信息比您声称的要多。您有标题(文本)内容、类(编辑、静态、按钮等)。我可以看到你有一个按钮,标签是
Get Acct..
,例如,HWND为
000107A0
。嗨,肯,是的,我希望我能以某种方式将手柄或任何其他信息合并到“FindWndowex”中这就是我昨天花了几个小时搜索的内容,但除了一个模糊的提示之外,我什么也没想到findwindowEX可能不是我应该使用的。你的Windows 8应用程序是否实现了
IAccessible
?您可以执行IAccessible。“WindowsForms10.Window.8.app.0.2004eee”是父对象,您可以尝试编辑其中一个子对象,也可以尝试使用Instr(WindowsForms10.Window.8.app.0.2004eee),以便它搜索提供的文本部分,而不是单词本身。谢谢(请注意,我不是这方面的专家,但我想知道输出是什么)我不太确定如何实现您提到的Instr?我遇到的主要问题是,为了导航到“Get Accnt”窗口,我必须从父窗口“General account Inquiry”类:WindowsForms10.EDIT.app.0.2004eee,然后导航到一个具有完全相同类名的子窗口,以便访问按钮“Get Acct”,谢谢Meaden,我想这绝对是一条路线,我必须做一些搜索,以找出确切的方法,但谢谢你的指导