如何获取鼠标光标下窗口的HWND以用于UIAutomation开发
解决方法
你已经通过GetCursorPos拿到了鼠标的屏幕坐标,直接调用Win32原生API WindowFromPoint传入坐标即可获取对应位置的窗口HWND。如果需要获取更精准的子窗口句柄(比如忽略禁用、隐藏窗口),可以搭配RealChildWindowFromPoint使用。
以下是可直接运行的修改后代码:
#include <windows.h> #include <UIAutomation.h> #include <atlbase.h> #include <atlcom.h> int main() { // 使用IAccessible需要先初始化COM环境 CoInitialize(NULL); { POINT p; // 获取鼠标当前屏幕坐标 GetCursorPos(&p); // 直接获取坐标对应的窗口HWND HWND hwnd = WindowFromPoint(p); // 可选替代逻辑:获取更精准的子窗口句柄 /* HWND rootHwnd = WindowFromPoint(p); POINT clientPt = p; ScreenToClient(rootHwnd, &clientPt); HWND hwnd = RealChildWindowFromPoint(rootHwnd, clientPt); */ CComPtr<IAccessible> pAcc; VARIANT varChild; if (SUCCEEDED(AccessibleObjectFromWindow(hwnd, OBJID_WINDOW,IID_IAccessible, reinterpret_cast<void**>(&pAcc)))) { CComBSTR bstrName, bstrValue, bstrDescription; varChild.vt = VT_I4; varChild.lVal = CHILDID_SELF; if (SUCCEEDED(pAcc->get_accName(varChild, &bstrName))) { auto name = bstrName.m_str; // 此处可添加名称的后续处理逻辑 } if (SUCCEEDED(pAcc->get_accValue(varChild, &bstrValue))) { auto value = bstrValue.m_str; // 此处可添加值的后续处理逻辑 } // 原代码此处接口调用错误,获取描述需调用get_accDescription if (SUCCEEDED(pAcc->get_accDescription(varChild, &bstrDescription))) { auto description = bstrDescription.m_str; // 此处可添加描述的后续处理逻辑 } } } CoUninitialize(); return 0; }
注意事项
- 原代码获取窗口描述的接口调用错误,重复调用了两次
get_accValue,已修正为get_accDescription - 若返回的HWND为空,说明鼠标指向桌面空白区域,可调用
GetDesktopWindow获取桌面窗口句柄兜底
内容的提问来源于stack exchange,提问作者user14881255
相关产品推荐
相关产品推荐

