C++ 如何检查鼠标按钮是否在屏幕上的任何位置被按下,甚至在我的主窗口之外?
在Qt中是否可以检测到在我的应用程序窗口内外按下的鼠标按钮,我想有一种方法可以检测到我的应用程序窗口内的鼠标点击,但是检测主窗口内外的鼠标点击又如何呢C++ 如何检查鼠标按钮是否在屏幕上的任何位置被按下,甚至在我的主窗口之外?,c++,visual-studio,qt,mouseevent,C++,Visual Studio,Qt,Mouseevent,在Qt中是否可以检测到在我的应用程序窗口内外按下的鼠标按钮,我想有一种方法可以检测到我的应用程序窗口内的鼠标点击,但是检测主窗口内外的鼠标点击又如何呢 是否可以在Qt中检测我的应用程序窗口内外按下的鼠标按钮 我不知道Qt本身是否提供了这样的功能,但底层操作系统可能提供了这样的功能。例如,在Windows上,您可以通过或使用鼠标钩子全局监视鼠标活动。我找到了解决方案,我实际上没有初始化IUIAutomation*automation=NULL在使用它之前,现在更新的版本是 BOOL Initia
是否可以在Qt中检测我的应用程序窗口内外按下的鼠标按钮
我不知道Qt本身是否提供了这样的功能,但底层操作系统可能提供了这样的功能。例如,在Windows上,您可以通过或使用鼠标钩子全局监视鼠标活动。我找到了解决方案,我实际上没有初始化
IUIAutomation*automation=NULL代码>在使用它之前,现在更新的版本是
BOOL InitializeUIAutomation(IUIAutomation** automation)
{
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(__uuidof(CUIAutomation), NULL,
CLSCTX_INPROC_SERVER, __uuidof(IUIAutomation),
(void**)automation);
return (SUCCEEDED(hr));
}
LRESULT CALLBACK MainWindow::mouseProc(int Code, WPARAM wParam, LPARAM lParam)
{
//Q_UNUSED(Code);
auto& ms = *(const MSLLHOOKSTRUCT*)lParam;
MSLLHOOKSTRUCT* pMouseStruct = (MSLLHOOKSTRUCT*)lParam;
if (pMouseStruct != nullptr)
{
if (wParam == WM_LBUTTONDOWN)
{
qDebug() << "Test Example";
IUIAutomationElement* elem = NULL;
IUIAutomation* automation = NULL;
BOOL stet = InitializeUIAutomation(&automation); //added this
POINT mousePt;
BSTR elemName = NULL;
if (stet)
{
GetCursorPos(&mousePt);
HRESULT hr = automation->ElementFromPoint(mousePt, &elem); //getting unhandles exception in call back
if (SUCCEEDED(hr) && elem != NULL)
{
elem->get_CurrentName(&elemName);
std::wstring ws(elemName, SysStringLen(elemName));
// std::wcout << ws << std::endl;
QString testing = QString::fromStdWString(ws);
qDebug() << testing;
elem->Release();
}
automation->Release();
SysFreeString(elemName);
}
}
// emit instance().mouseEvent();
}
// After that you need to return back to the chain hook event handlers
return CallNextHookEx(NULL, Code, wParam, lParam);
}
void MainWindow::closeEvent(QCloseEvent* event) // function executed when window is closed.
{
// Code for destroy
CoUninitialize();
}
BOOL初始化自动化(IUIAutomation**automation)
{
共初始化(空);
HRESULT hr=CoCreateInstance(uuuIdof(CUIAutomation),NULL,
CLSCTX\u在过程服务器中,\uuuuuIdof(IUIAutomation),
(a)自动化);
返回(成功(hr));
}
LRESULT回调主窗口::mouseProc(int代码、WPARAM WPARAM、LPARAM LPARAM)
{
//Q_未使用(代码);
auto&ms=*(const MSLLHOOKSTRUCT*)lParam;
MSLLHOOKSTRUCT*pmousestuct=(MSLLHOOKSTRUCT*)LPRAM;
if(pmousestuct!=nullptr)
{
如果(wParam==WM_LBUTTONDOWN)
{
qDebug()ElementFromPoint(mousePt,&elem);//在回调中获取未处理的异常
if(成功(hr)&&elem!=NULL)
{
元素->获取当前名称(&elemName);
std::wstring ws(elemName,SysStringLen(elemName));
//这听起来像一个。我可以问一下,为什么要检测不适用于您自己的应用程序的鼠标事件吗?当然,实际上我想检测UI元素(按钮/组合框/等等)在鼠标点击的帮助下,它应该是这样工作的,->如果我点击任何其他应用程序上的任何按钮,在我的应用程序窗口之外,我需要我的应用程序中该元素的一些信息application@VladFeinstein,是的,我试过了,需要更多的帮助,因为你可能可以编写一个内核模块/驱动程序,在任何地方拦截鼠标事件,b但在Qt框架内,您仅限于发送到应用程序的事件。多谢大家的努力!我已经阅读了一些内容并实现了此函数,但在回调LRESULT CALLBACK MainWindow::mouseProc(int-code,WPARAM-WPARAM,LPARAM-LPARAM){Q_UNUSED(code)中出现错误,未处理的异常auto&ms=*(const MOUSEHOOKSTRUCT*)lParam;MOUSEHOOKSTRUCT*pmouseststruct=(MOUSEHOOKSTRUCT*)lParam;if(pmousestuct!=nullptr){if(wParam==WM_LBUTTONDOWN){qDebug()@the_learnist首先,不要在评论中发布代码,而是编辑您的问题以添加新的详细信息。第二,是mouseProc()
声明为static
?您不能对windows钩子回调使用非静态类方法。第三,您使用的是WH\u MOUSE
还是WH\u MOUSE\u LL
?我假设是前者。第四,为什么要忽略code
参数?如果wParam
和lParam
没有有意义的值e> 代码<0
。第五,您实际遇到了什么错误?是编译时错误还是运行时错误?您需要更具体一些。请提供一个。@U learnist“我正在使用WM\U鼠标”-然后使用MSLLHOOKSTRUCT
而不是MOUSEHOOKSTRUCT
。您应该使用MSLLHOOKSTRUCT
中提供的鼠标坐标,而不是来自GetCursorPos()
。但更重要的是,您的automation
变量未初始化,因此在调用automation->ElementFromPoint()
时会崩溃。此外,即使一切正常,elem->Release();
也需要在if
块内,以防ElementFromPoint()
不返回元素。@学习者“我现在已经初始化了值”-现在您正在将automation
变量初始化为NULL,但是您仍然不能对其调用ElementFromPoint()
,通过NULL(未初始化)调用类方法是未定义的行为指针。您需要创建一个实际的CUIAutomation
对象(通过CoCreateInstance()
)用于automation
指向,然后才能调用它。