2017-08-09 54 views
1

私はこれに新しく、私たちの外部アプリケーションの1つと通信する優れたドキュメントを作成する方法を間違っています。外部プログラムへのVBA送信API呼び出し

私はこのアプリケーションの特定のボタン/ボックスを見つけるためにFindWindowEXを使用するチュートリアルを終え、フォームの1つにテキストを挿入することができました。

ボタンをクリックしようとするとロードブロッキングが発生しました。問題は、通信しようとしているアプリケーションが一意のクラス名を持っているということです。そのほとんどすべてが「WindowsForms10.Window.8.app.0.2004eee」と呼ばれているあなたが見ることができ、画像から

enter image description here

私は非常に最初で唯一のテキストにテキストを挿入できることを意味しています検索するには「クリック」する必要のあるボタンを押さえるために深く潜ってはいけません。

現在のコードは次のとおりです。起動時に常に起動するため、アプリケーションを開く必要はありません。

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が助けてくれるかもしれませんが、あなたが持っていると主張するよりも多くの情報があなたのイメージにあります。キャプション(テキスト)コンテンツ、クラス(EDIT、STATIC、BUTTONなど)があります。たとえば、 'Get Acct ... 'と表示され、HWNDが' 000107A0'のボタンがあるのがわかります。 –

+0

こんにちはKen、yeh私は何とかハンドルやその他の情報を「findwindowex」に組み込むことができたと思っていましたが、それは主に私が昨日探していた時間でしたが、曖昧なヒントfindwindowEXは私が使うべきものではないかもしれません。 –

+0

あなたのWindows 8アプリは 'IAccessible'を実装していますか? IAccessibleを実行することができます。 – ThunderFrame

答えて

1

多くのウィンドウが同じクラスを持っていると思いますが、操作したいウィンドウ(模擬クリック)は常にシーケンス内の同じ場所に表示されます。だから3番目のボタンを押したければ、それは常に3番目のボタンにはなりません。ボタンがテキストボックスと同じクラスを持っていても、実際にはボタンとテキストボックスのスーパーセットで8番目のボタンがあったとしても、それは常に8番目です。

ターゲットを見つけるまで(EnumChildWindowsを使用して)列挙してください。

+0

Meadenに感謝します。これは間違いなく私が検索する必要があると思いますそれを引き抜く方法を正確に把握するために、しかし方向性に感謝します –

関連する問題