【发布时间】: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