如何在静态函数 MouseProc、SetWindowsHookEx 中访问 ui 结构(文本框、标签)?

how to access ui structures(textboxes,labels) inside static function MouseProc, SetWindowsHookEx?

在我的 .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, WPARAM wParam, 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, WPARAM wParam, LPARAM lParam)
{
    ui->textbox->append(string);
}

您不能向 mouseProc 添加额外的参数。编译器不会接受它,它需要匹配 SetWindowsHookEx() 期望的签名。如果你求助于使用 type-cast 来强制编译器接受它,那么 OS 仍然不知道如何在调用挂钩时在运行时用值填充新参数,你只会最终破坏了调用堆栈,and/or 使您的代码崩溃。

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

至于编译器错误,它说的是正确的 - 你显示的 MainWindow class 没有名为 textbox 的成员,这就是访问 [=17] 的原因=](不管 ui 来自哪里)编译失败。因此,您需要弄清楚 textbox 的实际存储位置,然后从 THERE 而不是从 MainWindow.

访问它