c + + - Windows hook stoppet arbejde, når programmet læser database i qt?

Indlæg af Hanne Mølgaard Plasc

Problem



Mit program har en fejl, der har kæmpet mig i dagevis. Mit programindstillede vinduer krog for at lytte til tastaturtryk og museklik, når en tast trykkes eller musen klikkes, vil den relevante variabel tilføje et tal. Og når programmet starter, vil disse variabler blive indledt til nogle værdier, der læses fra databasen. Dybest set forekommer fejlen, hvis jeg holder ved med at trykke på tastaturet eller musen, når programmet starter, så windows krog vil bare stoppe med at arbejde. Og jeg forsøgte mit bedste for at løse denne fejl, og jeg skrev mange minimale eksempler så lidt som muligt, men der er stadig fejl her. Jeg vil bare vise, hvordan min kode ser ud i det mest minimale eksempel:


I widget.cpp:

Jeg sætter krogen som:



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);
}


og i widget s konstruktør:



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;
}


Og Database class er som:



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;
}


Så som du kan se, viste jeg dybest set alle koden for det minimale eksempel. Så når programmet starter, læser det data fra databasen og starter dataene til pressedTimes, og pressedTimes vil tilføje et nummer hver gang, når en tast trykkes.

Men fejlen opstår bare det øjeblik du starter dit program, og i mellemtiden holder du på tastaturet. Så stoppede krogen lige ved at arbejde. Ved ikke hvad der virkelig foregår der og hvordan man løser denne underlige fejl. Håber jeg forklarer mit spørgsmål klart og håber at nogen kan hjælpe mig med at løse denne fejl.
Tak.

Rediger:

BTW, jeg glemte at sige, så vidt jeg prøvede det, hvis jeg bare starter pessedTimes til 0 eller bare nogle andre værdier i stedet for at få værdi fra at læse database. Fejlen vil ikke ske. Det betyder også, at der er nogle konflikter mellem windows hook og læsning database?

Og jeg bruger Windows 10 og databasen er Windows adgang.

Bedste reference