Virtual Keycodes in Hexcode umwandeln



  • Hallo zusammen,

    ich hab mal wieder eine Frage (Problem) zur Umwandlung von Variablen und so weiter.
    Und zwar würde ich gerne von meinem Programm eine benutzerdefinierte Taste
    simulieren lassen. Diese Taste wird zuvor aus einer Datei in einen vector <string> gepackt (wird ausgelesen) und soll dann quasi als Virtual Keycode in die keyboard_event funktion eingesetzt werden. Das sieht dann so aus:

    keybd_event(analysevec[counter], 0, 0, 0);
    

    Natürlich haben IntelliSense und der Visual Studio Compiler ein Problem damit, da "keine entsprechende Konvertierung von std::string in BYTE" vorhanden ist. Es wäre ja kein Problem Buchstaben wie z.B. F in Ascii (und dann in Hex) umzuwandeln und dann als Variable für den Virtual Keycode einzusetzen, aber wie mache ich das dann bei VK_NUMPAD0 oder so? Da bräuchte ich dann ja das ganze als Hex Zahl(0x60). Muss ich mir dafür jetzt extra ne Tabelle anlegen oder gibts da auch noch eine einfachere Möglichkeit der Konvertierung? Google hat mir leider keine Ergebnisse gebracht...

    Vielen Dank für eure Hilfe...

    Gruß

    Cyax



  • Du hast auf so vielen Ebenen das Problem nicht verstanden, da weiß man gar nicht, wo man anfangen soll.

    Mach dir mal Gedanken über den Unterschied zwischen String und Zeichen, dann über den Unterschied zwischen Zeichen und Taste, dann über den Unterschied zwischen Wert und Darstellung einer Zahl.



  • Cyax schrieb:

    wie z.B. F in Ascii

    Cyax schrieb:

    aber wie mache ich das dann bei VK_NUMPAD0 oder so?

    Diese Tasten gibt's natürlich im ASCII Zeichensatz nicht, die WinAPI Funktion, die du aufrust, erwartet aber sowieso einen Virtual-Key-Code.
    Es scheint als wären die Virtual Codes ASCII kompatibel (zumindest Ziffern und A-Z), das heißt für die Ziffern 0-1 und Buchstaben A-Z kannst du den Tastenwert direkt an die Funktion übergeben.
    Bei den speziellen Tasten wirst du wohl um eine Tabelle nicht herum kommen.

    Generell zum Code:
    Warum überhaupt einen String Vector? Deine Zeichen-Codes passen ja alle perfekt mindestens in einen int. std::vector<int> würde also genügen.
    Falls ein char für die Codes reicht, könntest du den Vektor auch durch einen einfach std::string ersetzen.



  • Warum überhaupt einen String Vector? Deine Zeichen-Codes passen ja alle perfekt mindestens in einen int. std::vector<int> würde also genügen.
    Falls ein char für die Codes reicht, könntest du den Vektor auch durch einen einfach std::string ersetzen.

    Weil in der Datei nicht nur Keycodes stehen, sondern auch Text der ausgelesen wird.

    Aber trotzdem danke für die Antwort, ich werd mal schauen was sich machen lässt...

    @MFK ich denke mir ist sehr wohl bewusst was der Unterschied zwischen Zeichen und String ist, du hast vermutlich nur nicht meine Frage verstanden oder dir selbst noch nie den Zusammenhang zwischen Keycodes und ASCII angesehen...

    Gruß

    Cyax



  • Cyax schrieb:

    Weil in der Datei nicht nur Keycodes stehen, sondern auch Text der ausgelesen wird.

    Was steht denn in so einem String? Gib mal ein Beispiel.

    Cyax schrieb:

    @MFK ich denke mir ist sehr wohl bewusst was der Unterschied zwischen Zeichen und String ist, du hast vermutlich nur nicht meine Frage verstanden oder dir selbst noch nie den Zusammenhang zwischen Keycodes und ASCII angesehen...

    Mir ist zumindest klar, dass es Tasten gibt, die keine Zeichen erzeugen, dass es Zeichen gibt, für die man mehr als eine Taste drücken muss, und dass man Tasten auch wieder loslassen muss.



  • 1
    VK_F1
    3
    shutdown
    2
    steam.exe
    

    Das steht zum Beispiel in so einer Datei, die Zahl stellt quasi die Option dar
    und darunter steht die benutzerdefinierte Eingrenzung (3 steht z.B. für Prozess killen und steam.exe ist der Prozess welcher durch den Nutzer festgelegt wurde)
    1 steht für keypress und indemfall soll F1 gedrückt werden (automatisch). Alle Befehle werden übrigens nacheinander ausgeführt.
    Jetzt lese ich das ganze als String aus und überprüfe die einzelnen Optionen, welche durch die darauffolgende Zeile eingeschränkt werden, allerdings kann ich ja nicht die Virtual Keycodes in die keybd_event funktion als String einsetzen, daher suche ich ne Möglichkeit die Virtual Keycodes in Hexcode umzuwandeln um sie dann zu einem Int zu konvertieren und in keybd_event einsetzen zu können. Wenn es dafür keine Möglichkeit gibt müsste ich quasi nach dem Schema

    if(vec[counter] == "VK_NOCHWAS"){
    int vk = 0xff;
    keybd_event(vk,0,0);
    }
    

    vorgehen und das wäre in meinen Augen eher suboptimal ... 😮

    Gruß

    Cyax



  • Cyax schrieb:

    das wäre in meinen Augen eher suboptimal

    Anders wird es aber nicht gehen. Das Präprozessorsymbol VK_NOCHWAS ist zur Laufzeit in deinem Programm nicht mehr vorhanden. Du musst also auf jeden möglichen String prüfen. Das könnte man natürlich eleganter machen, mit einer Lookup-Tabelle oder so.

    Bedanke dich bei demjenigen, der das so abgespeichert hat.



  • Ok alles klar, danke für deine Antwort 🙂 indemfall werd ich mich mal mit look up tables beschäftigen...

    Bedanke dich bei demjenigen, der das so abgespeichert hat.

    Hätte ja sein können das es eine einfachere Lösung gibt, aber hat sich indemfall erledigt.

    Danke nochmal

    Gruß

    Cyax


Anmelden zum Antworten