3

大家好,

我正在开发一个 C# 程序,该程序需要能够在 Windows 7 Explorer 的新 ItemsView 控件中获取热门项目的索引。幸运的是,Microsoft 提供了一种通过 UI 自动化执行此操作的方法,即查询控件的自定义属性。

不幸的是,System.Windows.Automation 命名空间莫名其妙地似乎没有提供查询自定义属性的方法!这让我不得不完全放弃 C# 自动化命名空间并仅使用非托管 COM 版本。一种方法是将所有自动化代码放在一个单独的 C++/CLI 模块中,并从我的 C# 应用程序中调用它。但是,如果可能,我想避免使用此选项,因为它会向我的项目添加更多文件,并且我不得不担心 32/64 位问题等。

另一种选择是使用 ComImport 属性来声明相关接口并通过 COM-interop 完成所有操作。这就是我想做的。但是,IUIAutomation 和 IUIAutomationElement 等相关接口非常庞大。它们总共有数百种方法,并且引用了大量的接口(我假设我也必须声明),几乎所有这些我永远不会使用。我认为 UI 自动化接口也没有在任何类型库中声明,所以我不能使用 TLBIMP。

有什么方法可以避免手动将 bajillion 方法签名转换为 C#,而只声明我实际需要的十个左右的方法?我看到 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 回答