Seite 1 von 1

VirtualKey : So lasse ich einen String schreiben

Verfasst: 28.04.2007 15:26
von Xaby

Code: Alles auswählen

;/ (c) Folker Linstedt
Procedure WriteVirtualText(Text.s,P.l)
  m=Len(Text)
  Schrift=0
  Grosz=0
  For i=1 To m
    Letter=Asc(Mid(Text,i,1))
    
    If Letter>=48 And Letter<=57
      LetterV=$30+Letter-48
      Schrift=1
    EndIf
    
    If Letter>=65 And Letter<=90
      Grosz=1
      LetterV=$41+Letter-65
      Schrift=1
    EndIf 
    
    If Letter>=97 And Letter<=122
       ;Grosz=0
       LetterV=$41+Letter-97
       Schrift=1
    EndIf 
    
    
    If Schrift
      If Grosz
         keybd_event_(#VK_SHIFT, 0,1	,0)
      ;  Delay(P)
      EndIf
      
      keybd_event_(LetterV, 0, 0	, 0)
      Delay(P)
      
      
      If Grosz
         keybd_event_(#VK_SHIFT, 0, 1	, 0)
       ; Delay(P)
       Grosz=0
      EndIf
      
      Schrift=0
    EndIf
    
  Next
  
EndProcedure

WriteVirtualText("folker Folker",40)
Eine ganz lustige Sache, nur am Ende schreibt mir das Programm alles groß. Sobald ich einmal UMSCHALT gedrück habe, bleibt es.
Erneutes Drücken funktioniert nicht und einen Key-Release gibt es so auch nicht. Zu mindest geht es nicht mit dem KEYEVENTF_KEYUP

CAPS gibt es auch nicht. ....

eigentlich will ich nur Shift dazu schalten können und wieder aus.

Dank euch. Gruß, Folker :allright:

Verfasst: 28.04.2007 16:22
von AND51
#VK_CAPITAL ist die Capslock Taste. Ich würde die aber nicht nehmen. Warum? Weil auf einigen PC eingestellt ist, dass dann ein Piepton beim Betätigen der Capslock Taste ertönt. Außerdem kann man als Benutzer einstellen, ob die Capslock- oder die Shift-Taste zum freigeben (releasen) der Capslock-Taste gedrückt werden soll - diese Einstellung kannst du nicht wissen. Von daher: Nimm lieber Shift! :)

Wenn ich genug Zeit habe, schreibe ich dir eine schönere Prozedur. :wink:

Verfasst: 28.04.2007 16:48
von AND51
So, Folker, hier bitte. Meine Prozedur ist doch schon mal ein ganzes Stück übersichtlicher als deine, oder? :wink:
Außerdem habe ich Select verwendet, welches flexibel erweiterbar ist.

Der Parameter "pause" ist frei wählbar und gibt an, wie lang die Pause zwischen den einzelnen Buchstaben sein soll.

Bis jetzt werden nur Zahlen, Buchstaben und Leerzeichen unterstützt, aber wie ich ja sagte, das Ding ist flexibel erweiterbar. :D

Das Delay vor dem Prozeduraufruf dient dazu, dass man noch genug Zeit hat, um nach Notepad zu switchen, damit dort reingeschrieben werden kann.

Ich möchte dir noch was zum flexiblen Erweitern der Prozedur sagen. Hast du schon gemerkt, dass die ASCII-Werte der Zeichen 0, 1, ..., 9 und [Leerzeichen] direkt in keybd_event_() eingesetzt werden können? Mehr dazu steht unten in diesem Posting.

Code: Alles auswählen

EnableExplicit

Procedure type(text.s, pause.l=40)
	Protected *pos.Character=@text
	While *pos\c
		Select *pos\c
			Case 'A' To 'Z'
				keybd_event_(#VK_SHIFT, 0, 0, 0)
					keybd_event_(*pos\c, 0, 0, 0)
					keybd_event_(*pos\c, 0, #KEYEVENTF_KEYUP, 0)
				keybd_event_(#VK_SHIFT, 0, #KEYEVENTF_KEYUP, 0)
			Case 'a' To 'z'
				keybd_event_(*pos\c-32, 0, 0, 0)
				keybd_event_(*pos\c-32, 0, #KEYEVENTF_KEYUP, 0)
			Case '0' To '9', ' '
				keybd_event_(*pos\c, 0, 0, 0)
				keybd_event_(*pos\c, 0, #KEYEVENTF_KEYUP, 0)
		EndSelect
		*pos+SizeOf(Character)
		Delay(pause)
	Wend
EndProcedure



Delay(2345)
type("Folker Putt 0190")
Außer dem Pointer *pos brauche ich keine weiteren Variablen. Das Pointern macht meine Prozedur auch so schnell.


Folker, ich möchte dir noch einen Tipp geben: bei Zahlen machst du so eine komische Rechnung. Du schreibst:
> LetterV=$30+Letter-48
aber das ist völlig unnötig. Die Zahl 1 hat den ASCII-Wert 49. Dieser kann sofort in keybd_event_() eingesetzt werden. In deiner rechnung fressen sich $30 und -48 auf, weil $30 gleich 48 ist!

Verfasst: 28.04.2007 17:11
von AND51
Habe meine Prozedur nochmals verbessert.

Zeilenümbrüche (13), Tabstops (9), Leerzeichen (32) - deren ASCII-Werte können direkt so übernommen werden, weshalb man sie sehr einfach hinzufügen kann.

Man beachte bitte den String, den die Prozedur tippen soll, er erklärt noch einiges, zum Beispiel, dass ungültige Zeichen wie äöüß, die bis jetzt noch nicht vorhanden sind, übersprungen werden. Meiner Meinung nach ist es besser diese zu überspringen, anstatt irgendein Müll tippen zu lassen.

Code: Alles auswählen

EnableExplicit

Procedure type(text.s, pause.l=40)
	Protected *pos.Character=@text
	While *pos\c
		Select *pos\c
			Case 'A' To 'Z'
				keybd_event_(#VK_SHIFT, 0, 0, 0)
					keybd_event_(*pos\c, 0, 0, 0)
					keybd_event_(*pos\c, 0, #KEYEVENTF_KEYUP, 0)
				keybd_event_(#VK_SHIFT, 0, #KEYEVENTF_KEYUP, 0)
			Case 'a' To 'z'
				keybd_event_(*pos\c-32, 0, 0, 0)
				keybd_event_(*pos\c-32, 0, #KEYEVENTF_KEYUP, 0)
			Case '0' To '9', ' ', 9, 13
				keybd_event_(*pos\c, 0, 0, 0)
				keybd_event_(*pos\c, 0, #KEYEVENTF_KEYUP, 0)
		EndSelect
		*pos+SizeOf(Character)
		Delay(pause)
	Wend
EndProcedure

Delay(2345)
type("Folker Putt"+#CRLF$+"Zeilen-"+#CRLF$+"umbrüche kann ich auch, so wie Tab"+Chr(9)+"stops. ungültige Zéichen werden (ignoriert). diese müssen erst noch in die Prozedur zum SELECT hinzugefügt werden!")

Verfasst: 28.04.2007 17:52
von RSBasic
@AND51
Es gibt auch nen Edit-Button.

Verfasst: 28.04.2007 18:00
von AND51
Das ist richtig. Aber die Übersicht ist mir wichtiger.

Ich danke dir für dein positives Feedback zu meiner Prozedur! :allright:

Verfasst: 28.04.2007 18:10
von Sicro

Code: Alles auswählen

Procedure SendKeys(Keys.s)
  Protected i.l, KeyCode.w, VirtualKey.b, KeysState.b

  For i = 1 To Len(Keys)
    KeyCode = VkKeyScan_(Asc(Mid(Keys,i,1)))
    VirtualKey = KeyCode & $FF
    KeysState = (KeyCode >> 8) & $FF
    
    Select KeysState
      Case 1 ; Umschalt-Taste wird benoetigt
        keybd_event_(#VK_SHIFT,1,0,0)
      Case 6 ; "Alt Groß"-Taste wird benoetigt
        keybd_event_(#VK_RMENU,1,0,0)
    EndSelect
    
    keybd_event_(VirtualKey,1,0,0)
    keybd_event_(VirtualKey,1,#KEYEVENTF_KEYUP,0)
    
    Select KeysState
      Case 1 ; Umschalt-Taste wieder loslassen
        keybd_event_(#VK_SHIFT,1,#KEYEVENTF_KEYUP,0)
      Case 6 ; "Alt Groß"-Taste wieder loslassen
        keybd_event_(#VK_RMENU,1,#KEYEVENTF_KEYUP,0)
    EndSelect
  Next
EndProcedure
...müsste alle Zeichen unterstützen. :wink:

Mfg DerProgger

Verfasst: 02.07.2008 14:29
von Kaeru Gaman
aktuell hat grad Caine die Routine von Sicro gut brauchen können:

http://www.purebasic.fr/english/viewtop ... 352#250352

Verfasst: 26.07.2008 21:19
von Sicro
Freut mich zu hören :)
Vielen Dank für den Hinweis, Kaeru Gaman. :allright:

Mfg Sicro