В моей программе есть ошибка, которая мучила меня несколько дней.Моя программа установила хук 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.