char* to UINT (Hotkey)



  • Hallo liebe Community,

    ich möchte einen Hotkey mit RegisterHotKey() festlegen und diesen aus einer .ini Datei auslesen (den Modifier und den Key).

    Mit dem folgenden Code funktioniert es leider nicht: ^^

    char* key1 = new char[1024];
    char* mod1 = new char[1024];
    
    GetPrivateProfileString("hotkey", "key1", NULL, key1, 1024, dir_ini);
    GetPrivateProfileString("hotkey", "mod1", NULL, mod1, 1024, dir_ini);
    
    RegisterHotKey(hWnd, 22022, (UINT)mod1, (UINT)key1);
    

    Bitte um Vorschläge wie ich die Idee umsetzen kann.

    Danke ~



  • falsches subforum? klingt irgendwie nach Win ...



  • Ja, ist WINAPI.
    Du solltest den Returnwert von RegisterHotkey überprüfen, falls er 0 ist, solltest du den Fehler per GetLastError überprüfen. Sehr häufig dürfte er 1409 sein (Hotkey is already registered).
    Außerdem erwartet die Funktion als dritten Parameter nur Modifizier wie MOD_ALT, MOD_CONTROL und ähnliches, als vierten einen virtuellen Tastencode wie VK_12, VK_ADD usw..
    Ein char_array in einen unsigned int zu casten lässt sich zwar kompilieren, semantisch korrekt ist dies aber nicht.
    Du solltest also in der ini-Datei direkt die UINTs speichern und per GetPrivateProfileInt auslesen.Das hier bitte auch noch lesen.



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke an Vicious Falcon für die Antwort,

    jedoch ist mir noch schleierhaft was ich in die .ini jetzt genau eintragen soll, bzw ob die Funktion überhaupt stimmt 😕

    Also ich lese den UINT aus der .ini per:

    UINT key2;
    key2 = GetPrivateProfileInt("hotkey", "key2", NULL, dir_ini);
    
    RegisterHotKey(hWnd, 22022, NULL, key2);
    

    aus, und in der .ini steht:

    [hotkey]
    key1='R'
    

    oder kann ich nur den UINT 0x52 als R-Taste auslesen ?

    Btw.: Danke fürs Verschieben und Sorry 👍

    Greez~



  • [hotkey]
    key1=82
    

    Du schreibst die (Dezimal-) Zahl in die ini-Datei und kannst sie dann mit GetPrivateProfileInt direkt auslesen.
    Mit 'r' müsste es allerdings auch gehen, wenn auch nicht direkt. 'r' hat einen anderen (ASCII-) Wert (siehe hier). Du könntest also 'r' auslesen und mit VkKeyScan den VK-Code erhalten.
    Und der Returnwert sollte wirklich überprüft werden. Ein UnregisterHotkey wäre beim Beenden des Programms nicht verkehrt.

    Edit:

    [hotkey]
    key1=r
    

    So müsste es natürlich dann dadrin stehen.
    Edit2 : Wenn r darin steht, kannst du den Wert nur als String lesen, dessen ASCII-Code per int i = str[0] abfragen und dann die VkKeyScan - Fkt aufrufen.



  • Hat sich erledigt, hab Edit2 gerade gelesen, Danke dir !

    Edit: funktioniert leider noch nicht ganz:

    char* key1 = new char [1024];
    GetPrivateProfileString("hotkey", "key1", NULL, key1, 1024, dir_ini);
    int i = (int)key1;
    short kk1 = VkKeyScan((char)key1);
    RegisterHotKey(hWnd, 22020, NULL, kk1);
    

    in der .ini:

    [hotkey]
    key1=r
    

    Das letzte mal noch 🙄



  • Heißt bei dir dir_ini auch wirklich bspw. "./ini.ini". lpDefault sollte auch "\0" sein.

    char ccc[12];
    if(GetPrivateProfileString("hotkey","key1","\0",ccc,12,"./ini.ini")
        && ccc[0])
    {
    	TCHAR cText[32];
    	int pi = ccc[0];
    	int vk = (VkKeyScan(pi));
    	StringCbPrintf(cText,32,TEXT("%s %d %d)",ccc,pi,vk);
    	MessageBox(0,cText,0,0);
    }
    


  • Perfekt, jetzt funktioniert es 👍

    Danke !


Log in to reply