Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用Windows Automation API捕获鼠标事件并获取单击元素?_C++_Windows_Ui Automation - Fatal编程技术网

C++ 如何使用Windows Automation API捕获鼠标事件并获取单击元素?

C++ 如何使用Windows Automation API捕获鼠标事件并获取单击元素?,c++,windows,ui-automation,C++,Windows,Ui Automation,我想得到任何被鼠标指针点击的元素。那可能是一个按钮、一个窗口或一个菜单项,任何东西。我只需要边界框大小的信息。Windows Automation API似乎能够以树的形式获取UI元素,并且可以通过它获取元素的信息(在规范中,有关于边界框的属性)。但是,我不知道如何获取该树并检索用户单击的元素。web上有几个页面解释了主要原理,但没有有用的实现示例 如何使用自动化API捕获事件并获取触发的元素 编辑: 我找到了如何检索目标信息: <uiautomation.h> <ole2.h

我想得到任何被鼠标指针点击的元素。那可能是一个按钮、一个窗口或一个菜单项,任何东西。我只需要边界框大小的信息。Windows Automation API似乎能够以树的形式获取UI元素,并且可以通过它获取元素的信息(在规范中,有关于边界框的属性)。但是,我不知道如何获取该树并检索用户单击的元素。web上有几个页面解释了主要原理,但没有有用的实现示例

如何使用自动化API捕获事件并获取触发的元素

编辑:

我找到了如何检索目标信息:

<uiautomation.h>
<ole2.h>

HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
    ...

IUIAutomation *_automation;
hr = CoCreateInstance(__uuidof(CUIAutomation), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&_automation));
if (FAILED(hr))
    ...

POINT p;
GetCursorPos(&p);
IUIAutomationElement *_element;
hr = _automation->ElementFromPoint(p, &_element);
if (FAILED(hr))
    ...

// By example, get position and size information.
VARIANT _target_info;
hr = _element->GetCurrentPropertyValue(UIA_BoundingRectanglePropertyId, &_target_info);
if (FAILED(hr))
    ...

double *_data;
SafeArrayAccessData(_target_info.parray, (void**)&_data);
double posx = data[0];
double posy = data[1];
double width = data[2];
double height = data[3];

HRESULT hr=协同初始化(NULL);
如果(失败(小时))
...
自动化*\u自动化;
hr=CoCreateInstance(uu uuidof(CUIAutomation),NULL,CLSCTX_INPROC_服务器,IID_PPV_参数(&_automation));
如果(失败(小时))
...
p点;
GetCursorPos&p;
IUIAutomationeElement*\U元素;
hr=\u自动化->元素frompoint(p,&\u元素);
如果(失败(小时))
...
//通过示例,获取位置和大小信息。
变量_目标_信息;
hr=\u元素->GetCurrentPropertyValue(UIA\u BoundingRectanglePropertyId和\u目标\u信息);
如果(失败(小时))
...
双*数据;
安全阵列访问数据(_target_info.parray,(void**)和_data);
双posx=数据[0];
双位置=数据[1];
双宽度=数据[2];
双倍高度=数据[3];

我很确定我的文章帮助你找到了解决方案,请把它标记为答案,我只能说出你需要的函数,但是我发布了用于MESORRY的代码,即使它在C中可能是正确的,C++中也不一样。因为WinAPI以一种非常模糊的方式访问UI数据(SafeArrayAccessData等),这就是我在SOF寻求帮助的原因。谢谢你,我让你的答案,因为它可以帮助C开发者,但我不能标记答案,因为它将不帮助Windows C++开发人员。谢谢,有没有办法知道,元素是可调用的(按钮是可调用的),可扩展的(组合框是可扩展的),还是可选择的??我很确定我的帖子帮助你找到解决方案,请把它标记为答案,我只能命名你需要的函数,但是我发布了用于MESORRY的代码,即使它在C中可能是正确的,C++中也不是一样的。因为WinAPI以一种非常模糊的方式访问UI数据(SafeArrayAccessData等),这就是我在SOF寻求帮助的原因。不过,谢谢你,我让你回答她,因为它可以帮助C开发者,但我不能把它当成答案,因为它对Windows C++开发者没有帮助。谢谢,有没有什么方法可以让我知道元素是可调用的(按钮是可调用的),可扩展的(组合框是可扩展的)还是可选择的?