Хук Windows перестал работать, когда программа читает базу данных в Qt? - PullRequest
0 голосов
/ 19 мая 2018

В моей программе есть ошибка, которая мучила меня несколько дней.Моя программа установила хук Windows для прослушивания нажатия клавиш клавиатуры и щелчка мыши, при каждом нажатии клавиши или щелчке мыши соответствующая переменная добавляет одно число.И когда программа запускается, эти переменные будут инициированы в некоторые значения, которые считываются из базы данных.В основном ошибка возникает, если я продолжаю нажимать клавиатуру или мышь при запуске программы, тогда перехват Windows просто перестанет работать.И я старался изо всех сил, чтобы решить эту ошибку, и я написал как можно меньше минимальных примеров, но ошибка все еще здесь.Я просто покажу, как выглядит мой код в самом минимальном примере:

В widget.cpp:
я установил хук следующим образом:

HHOOK hHook = NULL;

LRESULT CALLBACK MyLowLevelKeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (wParam == WM_KEYUP) {
        Emitter::Instance()->keyPressed(); //emit this signal whenever a key is being pressed
        qDebug() << "Key Pressed"; //when hook stopped working, the debug message will not even show
    }
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

и в *Конструктор 1009 *:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);  //set hook here

    pressedTimes = database.returnTotalPressedTimes(); //get data from database and initiate pressedTimes
    ui->label->setText(QString::number(pressedTimes));

    connect(Emitter::Instance(), &SignalEmitter::keyPressed, [this](){ pressedTimes++; ui->label->setText(QString::number(pressedTimes)); }); //when key presses, ++pressedTimes;
}

И Database class имеет вид:

Database::Database()
{
    QString dbName = QString("Driver={Microsoft Access Driver (*.mdb)}; FIL={MS Access}; DBQ= C:/path/to/TestingDB.mdb");
    database = QSqlDatabase::addDatabase("QODBC");
    database.setDatabaseName(dbName);
}

//this function is used to initiate the pressedTimes variable when the program starts
int Database::returnTotalPressedTimes()
{
    int totalPressedTimes = 0;

    if(database.open()) {
        QSqlQuery sqlQuery;
        sqlQuery.exec("SELECT SUM(PressedTimes) FROM TestingTable"); //I trid my best to the testing database as simple as possible
        while(sqlQuery.next()) {
            totalPressedTimes = sqlQuery.value(0).toInt();
        }
        database.close();
    }
    else {
        qDebug() << database.lastError().text();
    }

    return totalPressedTimes;
}

Итак, как вы можете видеть, в основном я показал весь кодминимального примера.Поэтому, когда программа запускается, она считывает данные из базы данных и инициирует данные в pressedTimes, а pressedTimes будет добавлять одно число каждый раз, когда нажимается клавиша.

Но ошибка возникает только в тот момент, когда вы запускаете свою программу, а тем временем вы продолжаете нажимать на клавиатуру.Тогда крюк просто перестал работать.Не знаю, что на самом деле там происходит и как решить эту странную ошибку.Надеюсь, я четко объясню свой вопрос и надеюсь, что кто-нибудь поможет мне решить эту ошибку.
Спасибо.

Редактировать:
Кстати, я забыл сказать, насколько я это проверял, если я просто инициирую pessedTimes в 0 или просто в некоторые другие значения вместо получения значения изчтение базы данных.Ошибка не произойдет.Значит ли это, что есть некоторые конфликты между хуком Windows и чтением базы данных?
И я использую Windows 10, и база данных Windows Access.

...