Programm friert ein, wenn es Tastenbefehle bekommt



  • Ich hatte hier mal ein Thread über einen KeyEmulator für ein Spiel.
    Folgende Problematik: das "Objekt" friert ein, biss die Tasten gesendet worden sind.
    Manchmal stürzt es komplett ab.
    Egal ob Notepad oder Spiel, wobei es im Notepad nicht immer auftritt.
    Vielleicht hilft ja etwas code, aber es ist sicher ein Grundlegene Frage.
    Ich benutze die Keyloggerdll aus dem Forum (angepasst) und simuliere Tasten mit keybd_event.
    Ich weiß nicht weiter.
    (einer der längsten Teile die ich je postete)

    (Ich habe es mir recht einfach gemacht teilweise und frage mal nicht nach optik 😉 )

    void __fastcall TLOLKEYEMULE::KeyHook(TMessage &Message)
    {
        //
        GetKeyNameText(Message.LParam, Key, 80);
        if (String(Key).SubString(3,String(Key).Length()) == "(ZEHNERTASTATUR)")
        {
            if (VBSMethode->Checked)
            {
                String File = "vb"+String(Key).SubString(0,1)+".vbs";
                ShellExecute(NULL,NULL,File.c_str(),NULL,NULL,SW_SHOWNORMAL);
            }
            else
            {
                RemoveHook();
                TEdit* Edits[9];
                TCheckBox* checkies[9];
                Edits[0] = Edit1;
                Edits[1] = Edit2;
                Edits[2] = Edit3;
                Edits[3] = Edit4;
                Edits[4] = Edit5;
                Edits[5] = Edit6;
                Edits[6] = Edit7;
                Edits[7] = Edit8;
                Edits[8] = Edit9;
                checkies[0] = CheckBox1;
                checkies[1] = CheckBox2;
                checkies[2] = CheckBox3;
                checkies[3] = CheckBox4;
                checkies[4] = CheckBox5;
                checkies[5] = CheckBox6;
                checkies[6] = CheckBox7;
                checkies[7] = CheckBox8;
                checkies[8] = CheckBox9;
                int EdiNum = 0;
                if (String(Key).SubString(3,String(Key).Length()) == "(ZEHNERTASTATUR)")
                {
                    if (CanConvert(StrToInt(String(Key).SubString(0,1))))
                        EdiNum = StrToInt(String(Key).SubString(0,1)) - 1;
                    else
                        EdiNum = -1;
                    if (EdiNum == -1)
                    {
                        EdiNum = 0;
                    }
                    if (checkies[EdiNum]->Checked)
                    {
                       //    SetFocus(
                        keybd_event(VK_BACK, 0, 0, 0);
                        keybd_event(VK_BACK, 0, KEYEVENTF_KEYUP, 0);
                        keybd_event(VK_RETURN, 0, 0, 0);
                        keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
                    }
                    Sleep(250);
                    int i = 0;
                    for (i = 0; i < Edits[EdiNum]->Text.Length(); i++)
                    {
                        //Sleep(500);
                        bool shift = true;
                        char c = (Edits[EdiNum]->Text[i+1]);
                        if(c > 0x60 && c < 0x7B) //Kleinbuchstaben
                        {
                            shift = false;
                            c -= 0x20;
                        }
                        else if(c < 0x40 && c > 0x30) //Zahlen
                            shift = false;
    
                        int ResolutionKey = c;
                        switch ((int)Edits[EdiNum]->Text[i+1])
                        {
                            case(33):
                            {
                                ResolutionKey = 49;
                                shift = true;
                                break;
                            }
                            case(34):
                            {
                                ResolutionKey = 50;
                                shift = true;
                                break;
                            }
                            case(36):
                            {
                                ResolutionKey = 52;
                                shift = true;
                                break;
                            }
                            case(37):
                            {
                                ResolutionKey = 53;
                                shift = true;
                                break;
                            }
                            case(38):
                            {
                                ResolutionKey = 54;
                                shift = true;
                                break;
                            }
                            case(47):
                            {
                                ResolutionKey = 55;
                                shift = true;
                                break;
                            }
                        }
    
                        if(shift)
                            keybd_event(VK_SHIFT, 0, 0, 0);
                        keybd_event(ResolutionKey, 0, 0, 0);
                        keybd_event(ResolutionKey, 0, KEYEVENTF_KEYUP, 0);
                        if(shift)
                            keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
                    }
                    if (checkies[EdiNum]->Checked)
                    {
                        keybd_event(VK_RETURN, 0, 0, 0);
                        keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
    
                    }
                }
                SetHook();
            }
        }
    }
    

    EDIT: zur Funktionsweise:

    1. mit Keybd_event, da dachte ich da sei was falsch und hab es mit vb-scripts versucht. Aber es ist der selbe effekt, es müsste also am logger liegen, aber den mach ich ja mitlerweile aus, ich weiß auch nicht...



  • Tim06TR schrieb:

    .
       RemoveHook();
    .          
       SetHook();
    .
    

    Schon mal kommentiert?



  • rauskommentiert oder beschrieben mit comments ?

    RemoveHook();

    void __stdcall RemoveHook(void)
    {
      UnhookWindowsHookEx(ghhookKB);
    }
    

    SetHook();

    void __stdcall SetHook(void)
    {
      HOOKPROC lpfnHookProc = NULL;
      lpfnHookProc = GetProcAddress(GetModuleHandle("LoLKeyEmuleDLL"),"CheckKey");
      ghhookKB = SetWindowsHookEx(WH_KEYBOARD, lpfnHookProc, ghInst, NULL);
    }
    

    DLL:

    DWORD __stdcall CheckKey(int nCode, WORD wParam, LONG lParam)
    {
      HWND ghAppWnd = NULL;
      ghAppWnd = FindWindow("TLOLKEYEMULE", "Controlpanel");
      if((nCode < 0) || nCode == HC_NOREMOVE)
        return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
      if(lParam & 0x40000000)
        return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
      SendMessage(ghAppWnd, WM_KEYHOOK, wParam, lParam);
      return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
    }
    

    btw: ich nehm den Hook weg, da ich dachte, dass
    simulieren von Tastendrücken + Keyhook = böse
    aber das wegnehmen des Hooks ist irrelevant



  • Du baust dir selber böse Fallen ein.
    Wie geht das:

    EdiNum = -1;
    

    später

    Edits[EdiNum]
    

    In einem Array. Mag gutgehen, muss aber nicht.
    Die Hook-Routinen gehören für mein Verständnis da nicht rein. Wo sie gesetzt werden, weisst du ja aus dem Thread,
    den du oben gemeint hast (Link wäre nich schlecht gewesen).

    Von Debugger fiel auch noch kein Wort deinerseits...



  • 1. Wenn man die Abfrage danach beachtet, dann weiß man, dass es niemals dazu kommt: Edits[-1]. Auch wenn mir grad auffällt, dass da etwas überflüssig ist:

    EdiNum = -1
    if (EdiNum == -1)
    EdiNum = 0;

    warum nicht gleich EdiNum = 0 (der Abend lässt grüßen)

    2. Der Debugger wirft mich entweder A aus dem Spiel oder er sagt nichts, wenn B mein PC nichts mehr sagt (ich hoffe das ist verständlich).

    3. Es ist das FAQ unter "Tasten" und "Systemübergreifender Key Hook"

    4. Ich dachte, mit Sleep könnte ich das ganze besser Überwachen, aber ich habe folgende Theorien:

    a. Das Programm ist in gewisserweise mit meinem Verknüpft, wenn ich per Tastatur Signale sende. und mit Sleep provoziere ich ein einfrieren des Angesprochenen Programmes.
    (Habe es rausgenommen, und teste erneut wenn ich kann)

    b. Wenn die Abfolge zu lang ist, und das Programm zu lang "abstürzt" kann ich es nicht mehr retten. (Ich vergaß zu sagen, das ab und zu mein PC abstürzt bei tests im Spiel, btw das Spiel, aber ich komme nicht auf den Desktop zurück)



  • Noch ein paar Bemerkungen:
    Es ist eigentlich keine gute Idee, nach GetKeyNameText auszuwerten. Es gibt die virtuellen Tastencodes, mit denen
    du das SubStringing sparst. Zudem läuft dein Code nur auf deutschen Windows-Installationen.

    Teste den Code mal abschnittsweise in einer separaten Funktion(ev. auch Anwendung) OHNE Hooks und TMessage und füttere die Funktion mit
    einfachen Tasteneingaben oder aus einem char-Array.



  • kpeter schrieb:

    Noch ein paar Bemerkungen:
    Es ist eigentlich keine gute Idee, nach GetKeyNameText auszuwerten. Es gibt die virtuellen Tastencodes, mit denen
    du das SubStringing sparst. Zudem läuft dein Code nur auf deutschen Windows-Installationen.

    Daran habe ich noch gar nicht gedacht... Ich dachte ich kann mir die Hexwerte sparen, aber wohl doch nicht ....


Anmelden zum Antworten