1

ここ数日間、vb6 アプリケーションで特定のコントロールの AutomationElement を取得する最良の方法を見つけようとしてきました。

私の最初の方法は、次の条件で検索を行うことでした: new PropertyCondition(AutomationElement.NameProperty, controlName )

私は、これが小さなテスト VB6 アプリケーションで約 1 週間正しく機能していると仮定していました。

しかし、数日前に気付きました... vb6 テキストボックスをフォームにドラッグすると、'Name' プロパティ'Text' プロパティの両方が 'Text1' に設定されていました。

したがって、次のように検索すると、 new PropertyCondition(AutomationElement.NameProperty, 'Text1')
正しい要素が返されますが、次に行って 'Text' プロパティを '' に設定すると、同じ検索では何も返されません。

質問: VB6 コントロール名に基づいて AutomationElement を取得する方法を見つけた人はいますか?

私が試したこと:

  1. MSAA と同等のインターフェイスを取得し、'Name' プロパティを確認する - 結果: '' http://msdn.microsoft.com/en-us/library/windows/desktop/dd318490%28v=vs.85%29.aspx
  2. 他のプロパティ (AutomationId、RuntimeId) に基づいてコントロールを取得する - 結果: AutomationId - すべてのコントロールがこのプロパティを使用できるわけではないようです - RuntimeId - アプリが実行されるたびに変更されます
  3. 私は多くの異なるサイトを見てきましたが、主なものは以下にリストされています.

http://blogs.msdn.com/b/brianmcm/archive/2006/01/17/getting-the-winforms-id-of-a-control.aspx

デモアプリにはアクセスできますが、サードパーティによって作成された本番アプリにはアクセスできません。

ここからやろうとしていることは、フォーム上の位置に基づいて Automation 要素を取得することです..

ありがとうございました

4

2 に答える 2

0

評価が低いのでコメントできません。AutomationElement は絶対に必要ですか?

[user32.dll] ( http://pinvoke.net/default.aspx/user32.EnumChildWindows ) の呼び出しを確認することをお勧めします。FindWindowEx、GetWindow、EnumWindows、EnumChildWindows、GetWindowText などを見てください。

親ウィンドウのハンドルが必要なので、このループを使用して取得できます。そこから、他の関数を使用して、コントロールについて必要な情報を取得できます。

        IntPtr hWnd = IntPtr.Zero;
        foreach(var process in System.Diagnostics.Process.GetProcesses())
            if(condition)
                hWnd = process.Handle;

VB6 ウィンドウから必要な正確な情報をコメントしてください。より良いコードを提供します。

于 2013-07-05T14:50:49.513 に答える