2017-08-09 123 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,我認爲這絕對是一條必經之路,我將不得不做一些搜索弄清楚如何取消,但感謝你的方向 –