Wie Key-Code und Key-Wert jeweils in eine Variable speichern?



  • Hallo,

    ich würde gerne den Key-Code und den Key-Wert (ASCII) in jeweilige Variablen speichern, um später anhand der Werte verschiedene Funktionen aufrufen zu können.
    Wichtig ist, dass das ganze auch funktioniert, wenn das Programm im Hintergrund läuft (Background Input).

    Mit Qt gelang es mir recht einfach die benötigten Werte zu bekommen, wenn das Fenster im Vordergrund ist. Aber wenn es minimiert, im Hintergrund oder ein anderes Fenster davor ist, funktioniert das nicht mehr.

    Daher würde ich gerne auf die Windows-API zugreifen. Allerdings weiß ich nicht, welche API-Funktionen jeweils den Key-Code und den ASCII-Wert zurückliefern.
    Habe mal versucht einige der Funktionen von der unten verlinkten Seite anzuwenden, aber das Programm wollte nicht mehr kompilieren.

    Kann mir jemand da weiterhelfen?
    Danke
    https://msdn.microsoft.com/en-us/library/windows/desktop/ms632585(v=vs.85).aspx





  • Habe es mit qpm installiert.

    Habe ich das so richtig includiert?

    #include <C:\Qt\QHotkey\QHotkey\qhotkey.h>
    #include <QApplication>
    #include <QDebug>
    


  • Nein. Das repository hat eine Readme...die dient idR dazu hilfreiche infos zu geben.



  • Ok, kam damit nicht wirklich viel weiter.
    Habe es mit RegisterHotKey() versucht.
    Ich kann überprüfen, ob eine Taste gedrückt wird. Aber wieder nur, wenn das Fenster aktiv ist..

    RegisterHotKey((HWND)winId(), 0, MOD_IGNORE_ALL_MODIFIER, 0x42);
        MSG msg;
        GetMessage(&msg, 0, 0, 0);
        PeekMessage(&msg, 0, 0, 0, 0x0001);
    
        if(msg.wParam == 0x42)  //0x42 is 'b'
        {
            ui->label->setText("true");
            *(cheat_array + 16) = 0x11;
        }
        else
        {
            ui->label->setText("false");
            *(cheat_array + 16) = 0x22;
        }
    


  • #include <QApplication>
    #include <QDebug>
    #include <QHotkey>
    
    int main(int argc, char *argv[]) {
        QApplication a(argc, argv);
        QHotkey hotkey(QKeySequence("ctrl+alt+return"), true);
    
        QObject::connect(&hotkey, &QHotkey::activated, qApp, [&]() {
            qDebug() << "hotkey triggered";
        });
    
        return a.exec();
    }
    

  • Mod

    KratzKatz schrieb:

    RegisterHotKey((HWND)winId(), 0, MOD_IGNORE_ALL_MODIFIER, 0x42);
        MSG msg;
        GetMessage(&msg, 0, 0, 0);
        PeekMessage(&msg, 0, 0, 0, 0x0001);
    
        if(msg.wParam == 0x42)  //0x42 is 'b'
        {
            ui->label->setText("true");
            *(cheat_array + 16) = 0x11;
        }
        else
        {
            ui->label->setText("false");
            *(cheat_array + 16) = 0x22;
        }
    

    Ist das Dein Code? Ich hoffe doch nicht.

    Wo ist die MessageLoop, die Dir erst die Chance gibt auf die entsprechende Nachricht zu warten?
    Grundsatzfrage: Kennst DU die Grundlagen eines Windows Programmes und einer Nachrichtenschleife?



  • Martin Richter schrieb:

    Ist das Dein Code? Ich hoffe doch nicht.

    Wo ist die MessageLoop, die Dir erst die Chance gibt auf die entsprechende Nachricht zu warten?
    Grundsatzfrage: Kennst DU die Grundlagen eines Windows Programmes und einer Nachrichtenschleife?

    Nur zum testen.
    Habe es einigermaßen lösen können. Problem ist nur, dass ich keine Eingabe mehr mit der Taste machen kann, wenn ihr Wert überprüft wird. Ändert sich der Wert nach dem gescannt wird, wärend das Programm noch läuft, funktion die entsprechende Taste auch nicht mehr.

    RegisterHotKey(HWND(winId()), 0, 0, key_value);
    
        if(key_is_pressed == false)
        {
            index_B += 0x08;
            for(int i = 0, j = index_B; (*(cheat_array + j + i) != 0xD0) && (*(cheat_array + j + i + 3) != ifnr); i += 8)
            {
                index_B += 8;
            }
            //ui->label->setText("false " + QString::number(index_B, 16));
        }
        else
        {
            index_B += 0x08;
            //ui->label->setText("true " + QString::number(index_B, 16));
        }
    
    //...
    
    bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
    {
        Q_UNUSED(eventType);
        Q_UNUSED(result);
        MSG *msg = static_cast<MSG*>(message);
        if(msg->message == WM_HOTKEY)
        {
            key_is_pressed = true;
            true;
        }
        else
        {
            key_is_pressed = false;
            true;
        }
        return false;
    }
    

Log in to reply