如何访问静态函数MouseProc,SetWindowsHookEx中的ui结构文本框,标签?

问题描述

在我的.h文件功能中,mouseProc被声明为静态的(必须是)

.h文件

static LRESULT CALLBACK mouseProc(int Code,WPARAM wParam,LPARAM lParam);

最初,我以为我会将&ui作为此函数的参数添加,但我无法这样做。它给我错误“参数类型与HOOKPROC不兼容”

因此,现在我无法使用
访问UI中的文本框和标签 ui->textbox->apped();如何解决这个问题?

---根据使ui静态化的建议进行更新--------------

mainwindow.h

#pragma once
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "windows.h"
#include "windowsx.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT                      //Used to handle events
    Q_DISABLE_COPY(MainWindow) //added

public:
    MainWindow(QWidget* parent = 0);
    ~MainWindow();                    //Destructor used to free resources

    // Static method that will act as a callback-function
   static LRESULT CALLBACK mouseProc(int Code,LPARAM lParam);

 //   BOOL InitializeUIAutomation(IUIAutomation** automation);

  static Ui::MainWindow* ui; // declared static,pointing to UI class

private:

    // hook handler
    HHOOK mouseHook;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <Windows.h>
#include <UIAutomation.h>

using namespace std;

Ui::MainWindow* MainWindow::ui = 0;

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
    //,ui(new Ui::MainWindow)
{
    ui = new Ui::MainWindow();
    ui->setupUi(this);

    
     HINSTANCE hInstance = GetModuleHandle(NULL);

    // Set hook
    mouseHook = SetWindowsHookEx(WH_MOUSE_LL,&mouseProc,hInstance,0);
    // Check hook is correctly
    if (mouseHook == NULL)
    {
        qWarning() << "Mouse Hook failed";
    }
}
BOOL InitializeUIAutomation(IUIAutomation** automation)
{
    CoInitialize(NULL);
    HRESULT hr = CoCreateInstance(__uuidof(CUIAutomation),NULL,CLSCTX_INPROC_SERVER,__uuidof(IUIAutomation),(void**)automation);
    return (SUCCEEDED(hr));
}

MainWindow::~MainWindow()
{
    delete ui;
}
LRESULT CALLBACK MainWindow::mouseProc(int Code,LPARAM lParam)
{
    ui->textbox->append(string);
}

解决方法

您无法向mouseProc添加额外的参数。编译器不会接受它,它需要匹配SetWindowsHookEx()期望的签名。如果您诉诸于使用类型转换来强制编译器接受它,则OS仍将不知道如何在调用钩子时在运行时使用值填充新参数,并且最终会破坏调用堆栈,和/或崩溃您的代码。

要执行所需的操作,只需将ui指针存储在全局内存中,甚至也可以将其设置为staticmouseProc可以到达的某个地方。

至于编译器错误,它说的是正确的-您显示的MainWindow类没有名为textbox的成员,这就是为什么访问ui->textbox的原因(无论在何处) ui来自)编译失败。因此,您需要弄清楚textbox的实际存储位置,然后从那里而不是从MainWindow访问它。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...