【问题标题】:How to retrieve an Element from point with C如何使用 C 从点检索元素
【发布时间】:2021-01-25 07:25:29
【问题描述】:

我有以下代码来检索桌面特定位置的元素:

#include "UiAutomationclient.h"

IUIAutomation *pAutomation = NULL;
IUIAutomationElement *element = NULL;

CoInitialize(NULL);
      
EXTERN_C const CLSID CLSID_CUIAutomation;
EXTERN_C const IID IID_IUIAutomation;

HRESULT hr = CoCreateInstance(&CLSID_CUIAutomation,NULL, CLSCTX_INPROC_SERVER,&IID_IUIAutomation,(void**)&pAutomation);
if(SUCCEEDED(hr)){
  GetCursorPos(&pt);
  hr = pAutomation->ElementFromPoint(pt,&element);
  if(SUCCEEDED(hr) && element != NULL){

  }
  pAutomation->Release();
}
CoUninitialize();

编译后出现以下错误:

'ElementFromPoint': is not a member of 'IUIAutomation'
'Release': is not a member of 'IUIAutomation'

我被困在这一点上,因为我正在按照文档中的说明进行操作。如果有人可以帮助我解决 C 中的这些错误,请提前感谢。

【问题讨论】:

  • 如果 IUIAutomation 确实设计为支持 C 和 C++ 客户端,而您确实是从 C 中执行此操作,您可能需要通过 aIUIAutomation 的 lpVtbl 成员(或类似成员) . IE。 pAutomation->lpVtbl->ElementFromPoint(pt,&element); COM 接口的 vtable 在 C 程序中的设置有点奇怪,但应该是类似的。
  • @sergioMoreno:嗯,它在该页面上的代码示例顶部显示“C++”,所以不,您可能不能直接将这些代码示例复制粘贴到 C 项目中而不制作任何变化。是否有某些特定原因要在纯 C 中执行此操作?
  • @sergioMoreno 继续我之前提到的内容,您还可以使用传统上在 C 兼容的 COM 头文件中提供的宏。对于该成员,它将类似于 IUIAutomation_ElementFromPoint(pAutomation, pt, &element); 。您的 Release 调用可能会遇到类似的问题,在 C 中应该类似于 IUnknown_Release(pAutomation);
  • @IlmariKaronen,因为我使用了一个普通的 C 库,并且我正在添加一些我的项目所需的额外功能。这就是我决定使用普通 C 的原因。
  • @sergioMoreno 是的,你应该关心它。您需要在包含 COM 标头之前定义 COBJMACROS。在你的情况下,你可能应该把它放在预编译的头文件驱动程序中(如果你使用一个,你基于你的 pch 的头文件),或者直接放在预处理器配置中。

标签: c winapi com ui-automation


【解决方案1】:

使用 COM 形式 C 比使用 C++ 更冗长,但没有根本区别。

C++ 中的给定调用

HRESULT hr = com_interface->method( arguments );

转换为 C 看起来像

HRESULT hr = com_interface->lpVtbl->method( com_interface, arguments );

只需在接口指针和方法名称之间放置->lpVtbl-> 而不是->,然后重复接口指针作为第一个参数。

在 C++ 中

hr = pAutomation->ElementFromPoint(pt,&element);
...
pAutomation->Release();

在 C 中

hr = pAutomation->lpVtbl->ElementFromPoint(pAutomation,pt,&element);
...
pAutomation->lpVtbl->Release(pAutomation);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多