Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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++ 如何检查鼠标按钮是否在屏幕上的任何位置被按下,甚至在我的主窗口之外?_C++_Visual Studio_Qt_Mouseevent - Fatal编程技术网

C++ 如何检查鼠标按钮是否在屏幕上的任何位置被按下,甚至在我的主窗口之外?

C++ 如何检查鼠标按钮是否在屏幕上的任何位置被按下,甚至在我的主窗口之外?,c++,visual-studio,qt,mouseevent,C++,Visual Studio,Qt,Mouseevent,在Qt中是否可以检测到在我的应用程序窗口内外按下的鼠标按钮,我想有一种方法可以检测到我的应用程序窗口内的鼠标点击,但是检测主窗口内外的鼠标点击又如何呢 是否可以在Qt中检测我的应用程序窗口内外按下的鼠标按钮 我不知道Qt本身是否提供了这样的功能,但底层操作系统可能提供了这样的功能。例如,在Windows上,您可以通过或使用鼠标钩子全局监视鼠标活动。我找到了解决方案,我实际上没有初始化IUIAutomation*automation=NULL在使用它之前,现在更新的版本是 BOOL Initia

在Qt中是否可以检测到在我的应用程序窗口内外按下的鼠标按钮,我想有一种方法可以检测到我的应用程序窗口内的鼠标点击,但是检测主窗口内外的鼠标点击又如何呢


是否可以在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
指向,然后才能调用它。