Seite 1 von 2

Eingabe-event

Verfasst: 15.12.2006 22:03
von Rockmaster
Ich arbeite mit dem befehl: GetAsyncKeyState_().
Daher muss ich viele abfragen machen welche tasten je gedrückt wurden...das hat den nachteil dass meine prozessorauslastung auf 100% ansteigt.
Gibt es eine funktion mit der ich testen kann ob überhaupt eine taste gedrückt wurde?
Dann würde mein Programm die abfrageserie nur dann ausführen wenn er weis das überhaupt was gedrückt wurde.
Ich benutze gar keine plattform (also kein screen,kein window,keine konsole)
Danke im vorraus <)

Verfasst: 16.12.2006 10:39
von #NULL
funktionen gibt es nur auf plattformen.

screen:

Code: Alles auswählen

If KeyboardPushed(#PB_Key_All)
console:

Code: Alles auswählen

If OpenConsole()
  Repeat
    Inkey()
  Until RawKey()
  CloseConsole()
EndIf

es gibt zwar auch eine konstante #PB_Shortcut_All (für AddKeyboardShortcut) aber scheinbar nur zur vollständigkeit/ für die zukunft, sie wird nicht bearbeitet.

Verfasst: 16.12.2006 11:25
von manunidi
Sowas hier dürfte eigentlich reichen:

100% Auslastung:

Repeat : Until GetAsyncKeyState_(#VK_ESCAPE)

machst du aber eine 10 millisekunden pause rein, was überhaupt nicht ins gewicht fällt, dann haste 0 prozent auslastung:

Repeat : Delay(10) : Until GetAsyncKeyState_(#VK_ESCAPE)

Verfasst: 16.12.2006 11:50
von #NULL
im fenster gibt [Wait]WindowEvent() ein #WM_KEYDOWN zurück.



ganz ohne GUI könntest du dir vielleicht eine #VK-tabelle / ein array anlegen

Code: Alles auswählen

Repeat
  For i=0 To 256
    If GetAsyncKeyState_(i)
      Debug i
    EndIf
  Next
  Delay(10)    
Until 0
[keine ahnung obe der berech 0-256 auch wirklich alle keys enthält]

Verfasst: 16.12.2006 14:40
von Kaeru Gaman
für GetAsyncKeystate_() braucht man keinen kontext.
das läuft auch ohne fenster oder screen.


ich hab mal in der win32.hlp geschaut, und bin auf GetKeyboardState gestoßen.
The GetKeyboardState function copies the status of the 256 virtual keys to the specified buffer.
vielleicht kannst du den buffer leichter darauf checken, ob überhaupt eine taste gedrückt wurde.

außerdem brauchst du nur einen API-Call fürs ganze keyboard,
und machst die auswertung dann rein rechnerisch,
das dürfte dir schon mal ne menge luft geben.

wenn du dann noch ein Delay einbaust, dürfte die CPU-Last deines Progs minimiert werden...

Verfasst: 16.12.2006 18:32
von Rockmaster
ok thx für eure hilfe! Die methode mit den 10 millisekunden abwarten hat mich überzeugt ich werde die anwenden.
Plattformen kann ich ja nicht benutzen da diese aktiv sein müssen um tasten aufzuschnappen.

Verfasst: 16.12.2006 18:38
von ts-soft
Ein tool, das dauerhaft im Hintergrund laufen soll, mit nem Delay bremst das
System. Entweder ein richtiger Keyboardhook oder ein unsichtbares Fenster,
was noch am einfachsten umzusetzen ist.

Verfasst: 16.12.2006 19:43
von Kaeru Gaman
> ein richtiger Keyboardhook
ist das dann ein event-warter?


> ein unsichtbares Fenster

aber das reagiert ja auch nicht auf tastendrücke, die zu anderen fenstern gehören...
und GetAsyncKeystate_() erzeugt doch kein Event auf das WaitWindowEvent() reagiert....


@Rockmaster
denk vor allem mal drüber nach,
ob du mit einer interpretation des gesamten buffers den du von GetKeyboardState_()
bekommst nicht besser fährst, als mit zig aufrufen von GetAsyncKeystate_()

Verfasst: 16.12.2006 20:04
von ts-soft
Da ich den Sinn und Zweck dieses Keyloggers nicht kenne, halte ich mich
lieber raus. GetAsyncKeystate ist auf jedenfall immer die schlechteste
Variante, das System wird immer stark belastet.

Verfasst: 17.12.2006 17:33
von Rockmaster
ich hab in der Hilfsdatei nix zu GetKeyboardState_() gefunden...
Könnte mir bitte jemand nen crashkurs drüber geben?