Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: WinAPI ::  GetKeyState und GetAsyncKeyState     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Francis123
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.05.2012
Beiträge: 82
Beitrag Francis123 Mitglied 19:04:31 26.06.2012   Titel:   GetKeyState und GetAsyncKeyState            Zitieren

ich will tasten von der tastatur einlesen ohne dass das programm im vordergrund sein muss, die einzigen methoden die ich dafür gefunden hab waren GetAsyncKeyState(int) und GetKeyState(int).
ich hab diesen blog artikel gefunden,der davon abrät erstere methode zu benutzen. was haltet ihr davon?
ich hab erstmal diese for schleife, die alle tasten einliest und den keycode in konsole ausgibt:
C++:
for(int i = 8; i < 191; i++)
        {      
           if((ret=GetAsyncKeyState(i))&1 ==1)
           {
        cout<<i;
           }
        }

scheint sehr gut zu funktionieren, im vergleich zu dieser schleife:
C++:
    for(int i=0; i<191; i++)
        {
            if((ret=GetKeyState(i))<0)
            cout<<char(i)<<endl;
       
        }


ein wichtiger unterschied ist, dass bei der ersten schleife die tasten genauso eingelesen und ausgegeben werden wie sie sollten, in den genau richtigen zeitabständen wie bei allen eingabefeldern in windows. wenn eine taste gedrückt gehalten wird dann ist da eine kleine verzögerung, bis dann diese taste in vernünftigen zeitabschnitten gepumpt wird.
die zweite schleife ist bei einer sleep zeit von weniger als 50ms kaum zu gebrauchen, es werden mehrere tasten eingelesen wenn man die taste ein bisschen zu lange drückt, und wenn die sleep zeit zu groß ist vermute ich dass auch der ein oder andere tastendruck übersprungen wird.

was soll ich also machen? kann ich einfach GetAsyncKeyState benutzen oder hat das irgendwelche besonderen nachteile? kann man das problem bei der zweiten lösen?

ps:
beide methoden lesen bis auf die steuerzeichen nichts ein, wenn ein textfeld von MSN im vordergrund ist, bei icq ist das nicht der fall. weis jemand wieso?


Zuletzt bearbeitet von Francis123 am 19:08:27 26.06.2012, insgesamt 1-mal bearbeitet
-lowbyte-
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.10.2010
Beiträge: 372
Beitrag -lowbyte- Mitglied 07:36:14 27.06.2012   Titel:              Zitieren

Man erkennt sofort was Du machen möchtest...
Würde Dir empfehlen mal Grundlagen zu lernen, oder wie Du Dir Informationen beschaffst.
Hast Du die Funktionen bei MSDN schon mal angeschaut? Denn dann wäre alles klar!
Und es gibt weitaus mehr Methoden.

-> Keyboard Hook - SetWindowsHookEx
-> Treiber Filter (Kbdclass)
-> NtUserGetMessage oder NtUserPeekMessage hooken

_________________
XOR-BASE http://xor-base.dynu.net
News: C-Library SMTPLIBEXv1.06 Release 18.06.2013
Ombre
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2011
Beiträge: 25
Beitrag Ombre Mitglied 09:58:39 27.06.2012   Titel:              Zitieren

Wenn du das ganze in einer Console laufen lässt, kannst du diese mit
ShowWindow(GetConsoleWindow(), SW_HIDE); verstecken.

Dann kann auch ein anderes Fenster aktiv sein und trotzdem erkennt dein Programm
die Tasten mit den Funktionen die du schon benutzt.

Hat bei mir funktioniert, als ich einen Keylogger gebastelt habe um Tastenkürzel
abzufangen und eigene Fenster zu öffnen.

Gruß
Ombre
Jochen Kalmbach
Moderator

Benutzerprofil
Anmeldungsdatum: 11.11.2005
Beiträge: 12114
Beitrag Jochen Kalmbach Moderator 10:12:26 27.06.2012   Titel:              Zitieren

Warum sollte er ein Consolen-Programmm schreiben, wenn er keine Console will... das ist doch Sinnlos...

_________________
Greetings
Jochen
(Microsoft MVP VC++) My blog about Win32 and .NET: http://blog.kalmbach-software.de/ (deutsch)
Ombre
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2011
Beiträge: 25
Beitrag Ombre Mitglied 10:30:48 27.06.2012   Titel:              Zitieren

arrrrghh ja sorry, bin ganz schlimm Console gewohnt. Die meisten meiner Kollegen können mit Klicki-Bunti nichts anfangen.
Es ist natürlich auch möglich das Fenster zu verstecken und mit einem bestimmten Tastenkürzel wieder aufzurufen.

Also bei verlieren des Focus ShowWindow(hWnd, SW_HIDE); und wenn eine bestimmte
Tastenkombination kommt ShowWindow(hWnd, SW_SHOW);

Das war von mir auch nur ein Beispiel wie es gehen könnte, ohne sich in Hooks oder ähnliches einlesen zu müssen.
Manchmal nimmt man auch eine schnelle aber dreckige Lösung, anstatt sich komplett neu einlesen zu müssen.

Gruß
Ombre
eek_-_
Unregistrierter




Beitrag eek_-_ Unregistrierter 10:43:03 27.06.2012   Titel:              Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
12
int i=0;
while(1)
{
Sleep(1);
  for(int i ; i<255 ; i++)
  {
       if(GetAsyncKeyState(i) == -32767 )
       {
         cout<<"code: " << i << endl;
       }
  }
}


Das funktioniert eigentlich ganz gut um z.b. ein Programm mit ein paar Hotkeys auszustatten.

Du könntest dir natürlich auch die MSDN Hooks anschauen hier im Forum habe ich auch schon einmal ein funktionierendes beispiel dazu gefunden.

Erste Anlaufstelle sollte aber natürlich die MSDN sein:
http://msdn.microsoft.com ....... /windows/desktop/ms644959(v=vs.85).aspx
c++.de :: WinAPI ::  GetKeyState und GetAsyncKeyState   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.