从回调访问QT-GUI
我正在用windows钩子捕获程序中发生的所有鼠标事件:从回调访问QT-GUI,qt,user-interface,callback,qtgui,Qt,User Interface,Callback,Qtgui,我正在用windows钩子捕获程序中发生的所有鼠标事件: #include <Windows.h> #pragma comment(lib, "user32.lib") HHOOK hHook = NULL; using namespace std; LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) { switch( wParam ) { case 0x201:
#include <Windows.h>
#pragma comment(lib, "user32.lib")
HHOOK hHook = NULL;
using namespace std;
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
switch( wParam )
{
case 0x201: qDebug() << "Left click"; // Left click
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
hHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, NULL, 0);
if (hHook == NULL) {
qDebug() << "Hook failed";
}
ui->setupUi(this);
}
首先,我将向您的
main窗口
类添加新函数,该函数将返回指向要更新的标签的指针:
QLabel *MainWindow::label() const
{
return ui->label1;
}
然后,我将按照以下方式重写回调函数:
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
switch( wParam )
{
case 0x201:
qDebug() << "Left click"; // Left click
QWidgetList wl = QApplication::topLevelWidgets ();
foreach (QWidget *widget, wl) {
if (MainWindow *mw = qobject_cast<MainWindow *>(widget)) {
mw->label()->setText("Left click");
break;
}
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
现在,您可以通过回调调用它,如下所示:
[..]
mw->setMouseStatus("Left click");
令人惊叹的!非常感谢!
void MainWindow::setMouseStatus(const QString &text)
{
ui->label1->setText(text);
}
[..]
mw->setMouseStatus("Left click");