如何解决如何访问静态函数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
指针存储在全局内存中,甚至也可以将其设置为static
。 mouseProc
可以到达的某个地方。
至于编译器错误,它说的是正确的-您显示的MainWindow
类没有名为textbox
的成员,这就是为什么访问ui->textbox
的原因(无论在何处) ui
来自)编译失败。因此,您需要弄清楚textbox
的实际存储位置,然后从那里而不是从MainWindow
访问它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。