2017-08-09 290 views
1

我是很新的这一点,已经创建一个与我们的外部应用程序的一个连通的Excel文档摸索我的路。VBA发送API调用外部程序

我已经通过使用FindWindowEX找到这个应用程序的特定按钮/箱,已设法成功地插入文字的形式之一的教程。

我打了一个路障试图“点击”按钮时,我想的问题是,我试图用犯规通信的应用有独特的类名。

enter image description here

从可以看到的画面,几乎一切都被称为“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 

我有所有的常量/ declrations

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 

任何帮助将不胜感激,我几乎是昨天疯狂去网上淘试图寻找一个答案,这个问题,

谢谢您!

+1

EnumChildWindows可以提供帮助,但是图像中可用的信息比声明的要多。你有标题(文本)内容,类(编辑,静态,按钮等)。例如,我可以看到你有一个标有“Get Acct ...”的按钮,其HWND为“000107A0”。 –

+0

嗨,肯,我希望我能以某种方式将句柄或任何其他信息合并到“findwindowex”中,这大部分是我花了我的时间寻找昨天的东西,但没有提出任何比模糊暗示findwindowEX可能不是我应该使用的。 –

+0

你的Windows 8应用程序是否实现'IAccessible'?你可以执行一个IAccessible。 – ThunderFrame

回答

1

虽然我很同情,很多窗口具有相同的类,是不是要操纵(模拟点击)总是出现在一个序列中的同一个地方的窗口的情况。所以如果你想打第三个按钮,那么它不会总是第三个按钮。即使按钮与文本框具有相同的类别,因此实际上,按钮和文本框的超集中的第8个按钮仍然是第8个。

所以只是通过枚举(使用EnumChildWindows),直到你找到你的目标。

+0

谢谢Meaden,我认为这绝对是一条必经之路,我将不得不做一些搜索弄清楚如何取消,但感谢你的方向 –