Systemweite Textbox



  • Ich programmiere an einem Tool, was die Anschläge pro Minute an der Tastatur zählt und später graphisch darstellt.

    Dafür habe ich eine TextBox gemacht, in der man etwas eingeben kann. Die länge des strings in der TextBox sind dann die Anschläge an der Tastatur.

    Ich möchte das Programm aber später in die Taskbar verschieben können. Dafür muss diese TextBox Systemweit den Text aufnehmen. Als Win32 Konsolen programm habe ich das schon geschafft mit GetAsyncKeyState, aber das ging wegen einer while(1)-Schleife zu doll auf die CPU 🙂

    Also. Wie kann ich jeden Tastendruck auf die Tastatur in eine TextBox schreiben, ohne dass man den Cursor in der TextBox hat (halt Systemweit)???

    Ich benutze Visual C++ 6.0 (MFC) - dürfte klar sein 🙂



  • Also ich gib offen zu ich bin ein newbie aber so weit ich weiss verschickt windows für alles narichten. Und die kannst du in MFC soweit ich weiss mit ner MessageMap abfangen... dann braeuchte man auch keine schleife! ist aber nur ne idee ! weiss net wie das klappt und ob ueberhaupt



  • Hmm danke für den Vorschlag. Ich bräuchte aber etwas Handfestes, wenn es geht mit kurzem Beispielcode...

    Wie es mit Visual Basic geht weiss ich, aber das hilft mir unter C++ nicht viel 😃



  • Was du brauchst ist ein hook auf die Tastatur...
    Weil mit WM (Windowsnachrichten) wirst du hier nicht weiterkommen, da
    sie Fensterspezifisch sind, du must also direkt mit einem Hook das abfangen.
    Guck mal in der WinApi Faq/ forum dort gibt es mehr dazu. (suche...)

    devil



  • Du kannst das schon mit ner while(1) Schleife machen, einfach am Ende in der Schleife Sleep(1) schreiben, und das Programm geht nicht mehr soo auf die CPU



  • das habe ich gerade auf code guru gefunden:
    [url] http://www.codeguru.com/system/KBHook.html [/url]



  • Falls es jemanden interessiert:

    Ich habe eine andere (einfachere) Lösung gefunden. Das mit den Hook's war mir zu blöd!
    Ich habe einen Timer erstellt mit einem Interval von 1ms und in die Funktion OnTimer habe ich das hier geschrieben:

    void CTestDlg::OnTimer(UINT nIDEvent) 
    {
        short int KeyState;
    
        for (int i = 65; i <= 90; i++)
        {
            KeyState = GetAsyncKeyState(i);
    
            if(KeyState == -32767)
            {
                m_sEdit1 += (char) i;
            }
        }
    
        UpdateData(FALSE);
    
        CDialog::OnTimer(nIDEvent);
    }
    

    Das wäre meine Systemweite Textbox 🙂
    Ich habe zuerst befürchtet, dass dies auf die CPU geht, aber nach einigen Tests hat sich herausgestellt, dass die CPU eigentlich gar nicht belastet wird!

    Juhu 🙂 Wenn ihr noch etwas verbessern könnt (z.B. Groß/Kleinschreibung - brauch aber nicht) sagt mir bescheit...



  • lol, das ist die schrecklichste 'Lösung' die ich je gesehen habe. 😡



  • Immerhin funktioniert's gut!



  • Wolltest du jetzt hilfe für einen Tastatur-Hook oder hab ich das falsch verstanden.

    Klar kann man sein System mit Programmen zumüllen die schlecht gecodet sind aber ob das der Sinn darin ist stelle im mal in Frage.



  • wieso ist das eigentlich die schrecklichste lösung ?
    ich will was ähnliches machen wie scorpion, sprich tastendrücke systemweit abfangen und mist code liegt mir fern 😉
    kann mir also jmd sagen wieso die lösung unfein is ?


Anmelden zum Antworten