3

みなさん、こんにちは。

私は、Windows 7 Explorerの新しいItemsViewコントロールでホットアイテムのインデックスを取得できる必要があるC#プログラムに取り組んでいます。幸い、Microsoftは、コントロールのカスタムプロパティをクエリすることにより、UIオートメーションを介してこれを行う方法を提供しています。

残念ながら、System.Windows.Automation名前空間は、不可解にもカスタムプロパティをクエリする方法を提供していないようです。これにより、C#Automation名前空間を完全に破棄し、管理されていないCOMバージョンのみを使用しなければならないという望ましくない立場が残ります。これを行う1つの方法は、すべての自動化コードを別のC ++ / CLIモジュールに入れて、C#アプリケーションから呼び出すことです。ただし、プロジェクトにファイルが追加されるため、可能であればこのオプションは避けたいと思います。また、32/64ビットの問題などについて心配する必要があります。

もう1つのオプションは、ComImport属性を使用して関連するインターフェースを宣言し、COM相互運用機能を介してすべてを実行することです。これが私がやりたいことです。ただし、IUIAutomationやIUIAutomationElementなどの関連するインターフェイスは、非常に大きなものです。それらには合計で数百のメソッドがあり、参照トンとトンのインターフェース(私も宣言する必要があると思います)があり、そのほとんどすべてを使用することはありません。UIオートメーションインターフェイスもタイプライブラリで宣言されていないと思うので、TLBIMPを使用できません。

バジリオンのメソッドシグネチャを手動でC#に変換する必要がなく、代わりに実際に必要な10個程度のメソッドのみを宣言する方法はありますか?C#4.0では、COMの相互運用を容易にするはずの新しい「動的」タイプが追加されたことがわかります。それは私の問題にまったく関係がありますか?

ありがとう

4

1 に答える 1

7

(C#からCOMメソッドを呼び出すという観点から)最も重要なことは、メソッドがインターフェイスに正しい順序で表示されることです。メソッドを使用していない場合は、それをvoidとして宣言するだけで、悪いことは何も起こりません(実際にメソッドを呼び出さない限り)。これにより、正しい署名を作成したり、他のすべてのタイプを定義したりする必要がなくなります。たとえば、

[ComImport, Guid("30cbe57d-d9d0-452a-ab13-7ac5ac4825ee"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IUIAutomation
{
    void CompareElements();
    void CompareRuntimeIds();
    void GetRootElement();
    // 50 or so other methods...
    // ... define only the signatures for the ones you actually need
}

メソッドは、UIAutomationClient.h(Windows SDK内)に表示​​されるのとまったく同じ順序で定義する必要があります。

于 2010-05-15T05:53:57.530 に答える