Seite 1 von 2

keybd_event_()

Verfasst: 05.01.2009 22:37
von Oliver1994
Hallo,

hab folgendes Problem:

Will den API: keybd_event_() nutzen...

funzt auch Super alldings will ich den ja nich 10mal aufrufen wenn ich hallo ich bins schreiben will

Sondern ich würde es gerne so machen:

Code: Alles auswählen

For a=1 to Len(eingabe$)
dim test(len(eingabe$))
Zeichen$ StringField(eingabe$, a, "")
test(a) = Zeichen$
keybd_event_("#VK_"+Zeichen$,0,0,0)
next
^^Das Funktioniert ja nicht! Ich verstehe ja auch warum aber wie kann ich das denn lösen?

Gruß

JENS

Verfasst: 06.01.2009 01:11
von KeyKon
Mir is nich so ganz klar was der Code überhaupt machen soll ;-)
Vll solltest du erstma Einrücken, überprüfen ob alle = gesetzt sind und dann in der Hilfe nachschlagen was StringField() eigentlich macht ;-)

Verfasst: 06.01.2009 09:43
von real
Der Code ist großer Müll:

Code: Alles auswählen

keybd_event_("#VK_"+Zeichen$,0,0,0)
1. Wird #VK_x nicht in Anführungszeichen gesetzt, weil es eine Variable ist.
2. Kann man das nicht einfach über #VK_+Zeichen$ machen, weil z.B. das Leerzeichen '#VK_ ' nicht existiert. #VK... sind die virtuellen Tastencodes. Zur Nutzung von keybd_event_() siehe auch hier: http://msdn.microsoft.com/en-us/library ... S.85).aspx

Gruß

Verfasst: 06.01.2009 12:46
von Oliver1994
Das der Code nicht funzt ist mir klar!

Desswegen wollte ich ja wissen wie man es macht!

Gruß

JENS

Verfasst: 06.01.2009 13:06
von Kaeru Gaman
dein grunddenkfehler ist:
eine Konstante ist keine zeichenkette, sondern ein Wort das im Code steht das zur Compilezeit durch einen Wert ersetzt wird.
also zu deutsch, ein Ersatz für eine Zahl damit der Programmierer leichter sehen kann worum es sich handelt.

sämtliche #VK_ konstanten sind also Zahlen, die Tasten bedeuten.
auf der anderen Seite hast du in deinen Strings auch Zahlen, die Zeichen bedeuten.
du könntest dir jetzt also z.b. eine Tabelle anlegen, in der du dem Zeichenwert einen Tastenwert zuordnest,
und in der Schleife übergibst du dann den Wert aus der Tabelle an deinen API-Call.

Verfasst: 06.01.2009 13:35
von real
Oliver1994 hat geschrieben:Desswegen wollte ich ja wissen wie man es macht
Und genau deshalb der Verweis auf das MSDN.

Aber Kaeru Gaman wurde ja schon konkreter.

Verfasst: 06.01.2009 14:00
von Oliver1994
Jo danke!

Verfasst: 26.01.2009 12:21
von Oliver1994
Hallo!

Ich möchte gerne das er einen bestimmten String an ein bestimmtes Gadget sendet!

Jetzt werden viele sagen "Nimm doch einfach SetGdagetText()" << Diese Lösung ist bei mir aber nicht machbar da es sich ums WebGdaget handel!Nin habe ich folgenden Code geschrieben! (Ich weiß er ist nicht besonders ordentlich aber es war auch nur ein kleiner TEST!)

Dies ist nur ein Ausschnitt...

Warum funzt er nicht! Wenn ich den Befehl so nehme funzt es :-(



Code: Alles auswählen

  
name$ = "ichbins"

name$ = LCase(name$) 

SetActiveGadget(#Web_0)

For k=1 To Len(name$)
      char$ = StringField(name$, k, "")
      Debug char$
       If char$ = "a"
       keybd_event_(#VK_A,0,0,0)
       ElseIf char$ = "b"
       ElseIf char$ = "a"
       keybd_event_(#VK_A,0,0,0)
       ElseIf char$ = "b"
       keybd_event_(#VK_B,0,0,0)
       ElseIf char$ = "c"
keybd_event_(#VK_C,0,0,0)
ElseIf char$ = "d"
keybd_event_(#VK_D,0,0,0)
ElseIf char$ = "e"
keybd_event_(#VK_E,0,0,0)
ElseIf char$ = "f"
keybd_event_(#VK_F,0,0,0)
ElseIf char$ = "g"
keybd_event_(#VK_G,0,0,0)
ElseIf char$ = "h"
keybd_event_(#VK_H,0,0,0)
ElseIf char$ = "i"
keybd_event_(#VK_I,0,0,0)
ElseIf char$ = "j"
keybd_event_(#VK_J,0,0,0)
ElseIf char$ = "k"
keybd_event_(#VK_K,0,0,0)
ElseIf char$ = "l"
keybd_event_(#VK_L,0,0,0)
ElseIf char$ = "m"
keybd_event_(#VK_M,0,0,0)
ElseIf char$ = "n"
keybd_event_(#VK_N,0,0,0)
ElseIf char$ = "o"
keybd_event_(#VK_O,0,0,0)
ElseIf char$ = "p"
keybd_event_(#VK_P,0,0,0)
ElseIf char$ = "q"
keybd_event_(#VK_Q,0,0,0)
ElseIf char$ = "r"
keybd_event_(#VK_R,0,0,0)
ElseIf char$ = "s"
keybd_event_(#VK_S,0,0,0)
ElseIf char$ = "t"
keybd_event_(#VK_T,0,0,0)
ElseIf char$ = "u"
keybd_event_(#VK_U,0,0,0)
ElseIf char$ = "v"
keybd_event_(#VK_V,0,0,0)
ElseIf char$ = "w"
keybd_event_(#VK_W,0,0,0)
ElseIf char$ = "x"
keybd_event_(#VK_X,0,0,0)
ElseIf char$ = "y"
keybd_event_(#VK_Y,0,0,0)
ElseIf char$ = "z"
keybd_event_(#VK_Z,0,0,0)
ElseIf char$ = "1"
keybd_event_(#VK_1,0,0,0)
ElseIf char$ = "2"
keybd_event_(#VK_2,0,0,0)
ElseIf char$ = "3"
keybd_event_(#VK_3,0,0,0)
ElseIf char$ = "4"
keybd_event_(#VK_4,0,0,0)
ElseIf char$ = "5"
keybd_event_(#VK_5,0,0,0)
ElseIf char$ = "6"
keybd_event_(#VK_6,0,0,0)
ElseIf char$ = "7"
keybd_event_(#VK_7,0,0,0)
ElseIf char$ = "8"
keybd_event_(#VK_8,0,0,0)
ElseIf char$ = "9"
keybd_event_(#VK_9,0,0,0)
ElseIf char$ = " "
keybd_event_(#VK_SPACE,0,0,0)
Else 
MessageRequester("Log", "Error! Der Name darf nur aus Zeichen oder Ziffern bestehenen!",0)
EndIf
Gruß

JENS

Verfasst: 26.01.2009 16:13
von Tafkadasom2k5
Sehr coole Aktion :lol:

ein Blick in die ASCII-Tabelle, und der Vergleich mit den Virtual-Keycodes (den #VK- Konstanten) hätte dich schonmal auf eine weitaus kürzere Lösung bringen können.

Aber versuchs doch mal so! (Code eben zusammengeklackert, nicht getestet...mit etwas Pech hast du lediglich Buchstaben-Unterstützung...)

Code: Alles auswählen

Procedure Tippen(sVALUE.s) 
    If Len(sVALUE) <> 1
        MessageRequester("Fehler!","So läuft das nicht! Nur 1 Buchstabe zur Zeit!")
        End
    EndIf
    
    lASC = Asc(sVALUE)
    lKeyCode = VkKeyScan_(lASC)
    
    If lASC >= 65 And lASC <= 90
        lUCase = #True
    EndIf

    ;Shift drücken...
    If lUCase
        KeyBd_Event_(#VK_SHIFT, #Null, #Null, #Null)
    EndIf

    ;Taste drücken
    KeyBd_Event_(lKeyCode, #Null, #Null, #Null)

    ;Shift loslassen
    If lUCase THEN
        KeyBd_Event_(#VK_SHIFT, #Null, #KEYEVENTF_KEYUP, #Null)
    EndIf
    
    SLEEP(1)

EndProcedure


 sNAME.s = "dAs isT jA oberc0OL!"

 For i.l=1 To Len(sName)
   Tippen(Mid(sName,i,1))
 Next    

Verfasst: 26.01.2009 18:22
von Oliver1994
Aber PureBasic kannst du schon oder!

es gibt nicht:

If lUCase THEN
KeyBd_Event_(#VK_SHIFT, #Null, #KEYEVENTF_KEYUP, #Null)
EndIf

sondern

If lUCase
KeyBd_Event_(#VK_SHIFT, #Null, #KEYEVENTF_KEYUP, #Null)
EndIf

oder seleep(1) ist delay(1)

Aber trotzdem Danke...

Gruß

JENS