VirtualKey : So lasse ich einen String schreiben

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

VirtualKey : So lasse ich einen String schreiben

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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!")
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@AND51
Es gibt auch nen Edit-Button.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Das ist richtig. Aber die Übersicht ist mir wichtiger.

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

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag von Kaeru Gaman »

aktuell hat grad Caine die Routine von Sicro gut brauchen können:

http://www.purebasic.fr/english/viewtop ... 352#250352
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag von Sicro »

Freut mich zu hören :)
Vielen Dank für den Hinweis, Kaeru Gaman. :allright:

Mfg Sicro
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten