Pau*_*ano 3 c# com interface com-interop ui-automation
问候所有,
我正在开发一个C#程序,它需要能够在Windows 7 Explorer的新ItemsView控件中获取热门项目的索引.幸运的是,Microsoft通过查询控件的自定义属性,提供了一种通过UI自动化实现此目的的方法.
不幸的是,System.Windows.Automation命名空间莫名其妙地似乎没有提供查询自定义属性的方法!这使我不得不完全抛弃C#Automation命名空间并仅使用非托管COM版本.一种方法是将所有自动化代码放在单独的C++/CLI模块中,并从我的C#应用程序中调用它.但是,如果可能的话,我想避免使用此选项,因为它会为我的项目添加更多文件,而且我不得不担心32/64位问题等等.
另一个选择是使用ComImport属性来声明相关接口并通过COM-interop完成所有操作.这就是我想做的.但是,相关的接口,如IUIAutomation和IUIAutomationElement,正在变得非常大.他们总共有数百种方法,参考吨和大量的接口(我假设我还必须声明),几乎所有这些都是我永远不会使用的.我不认为UI自动化接口也在任何类型库中声明,所以我不能使用TLBIMP.
有什么方法可以避免手动将bajillion方法签名转换为C#而只是声明我实际需要的十个左右的方法吗?我看到C#4.0添加了一个新的"动态"类型,可以缓解COM互操作; 那与我的问题有关吗?
谢谢
最重要的是(从C#调用COM方法的角度来看)方法以正确的顺序出现在界面中.如果你没有使用某个方法,你可以将它声明为无效并且不会发生任何不好的事情(除非你实际调用它!).这样您就不必编写正确的签名并定义所有其他类型等.例如,
[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
}
Run Code Online (Sandbox Code Playgroud)
这些方法的定义应与它们在UIAutomationClient.h(在Windows SDK中)中出现的顺序完全相同.
| 归档时间: |
|
| 查看次数: |
627 次 |
| 最近记录: |