Seite 1 von 2

[ERLEDIGT] Sendkey() für STRG + A und STRG+C

Verfasst: 09.02.2016 13:00
von basiszero
Hallo Zusammen,

ich habe aus dem englischen Forum folgenden Code für die Funktion Sendkey():

Code: Alles auswählen

;- Procedure Sendkey

Procedure SendKey(Key.s) 
  ; get virtual key code and shift state 
  VK.w = VkKeyScan_(Asc(Key)) 
  
  If VK = -1 
    ProcedureReturn 
  EndIf 
   
  ; get scan code if an extended key 
  If MapVirtualKey_(VK, 2) = 0 
    Extended.l = #KEYEVENTF_EXTENDEDKEY 
    ; get scan code 
    Scan.l = MapVirtualKey_(VK, 0) 
   Else 
    Extended = 0 
    Scan = 0 
   
  EndIf 
  
  ; press shift/ctrl/alt if needed 
  Shift.l = VK & $100 
  Ctrl.l = VK & $200 
  Alt.l = VK & $400 
  If Shift 
    keybd_event_(#VK_SHIFT, 0, 0, 0) 
  EndIf 
  If Ctrl 
    keybd_event_(#VK_CONTROL, 0, 0, 0) 
  EndIf 
  If Alt 
    keybd_event_(#VK_MENU, 0, 0, 0) 
  EndIf 
  
  ; press and release key 
  VK & $ff 
  keybd_event_(VK, Scan, Extended, 0) 
  keybd_event_(VK, Scan, #KEYEVENTF_KEYUP | Extended, 0) 
  
  ; release shift/ctrl/alt if pressed 
  If Shift 
    keybd_event_(#VK_SHIFT, 0, #KEYEVENTF_KEYUP, 0) 
  EndIf 
  If Ctrl 
    keybd_event_(#VK_CONTROL, 0, #KEYEVENTF_KEYUP, 0) 
  EndIf 
  If Alt 
    keybd_event_(#VK_MENU, 0, #KEYEVENTF_KEYUP, 0) 
  EndIf 
EndProcedure 

; send string to foreground application  
Procedure SendKeys(String.s) 
  For Letter.l = 1 To Len(String) 
    SendKey(Mid(String, Letter, 1)) 
  Next 
EndProcedure 


RunProgram("notepad.exe")
Delay(1000)
SendKeys("^(c)")

Leider kann ich damit nur Zeichenketten / Zeichen übergeben, aber keine Tastenkombination wie STRG + A zum markieren bzw. STRG+C zum kopieren.

Hat jemand ne Lösung ?

Vielen Dank schon mal... :wink:

Re: Sendkey() für STRG + A und STRG+C

Verfasst: 09.02.2016 13:29
von Macros
In dem Code siehst du doch schon wie STRG dazu gedrückt werden kann.

Code: Alles auswählen

  If Shift 
    keybd_event_(#VK_SHIFT, 0, 0, 0) 
  EndIf 
  If Ctrl 
    keybd_event_(#VK_CONTROL, 0, 0, 0) 
  EndIf 
  If Alt 
    keybd_event_(#VK_MENU, 0, 0, 0) 
  EndIf 
Also füg der Funktion einen optionalen Parameter hinzu, z.B. "Procedure SendKey(Key.s, AndCtrl=0) "
und ändere das "If Ctrl" in "If Ctrl OR AndCtrl" und fertig.
Gleiches für Alt und Shift.

Es lohnt sich Codes, die man kopiert auch anzusehen. Man lernt dabei viel.

Re: Sendkey() für STRG + A und STRG+C

Verfasst: 09.02.2016 14:50
von basiszero
Hallo Macros,

vielen Dank für deine Hilfe. Muss zugeben ich habe mir den Code angschaut, aber irgendwie stehe ich voll auf dem Schlauch. :(
Soweit habe ich die Sache vervollständigt.

Aber wie erfolgt nun der Aufruf ?

Code: Alles auswählen


; so geht es mal nicht....

Sendkeys("{Ctrl}c")


Re: Sendkey() für STRG + A und STRG+C

Verfasst: 09.02.2016 15:03
von Macros
Hier der Code mit den Änderungen, ich hab sie durch ; ## markiert.
3 Stück sind es, bei den Parametern, bei dem If und beim Aufruf unten.

Du musst den optionalen Parameter AndCtrl auf 1 setzen, dann drückt er die Taste, die du angibst und Ctrl.
Wenn du nur a drücken willst, verwendest du SendKeys("c") oder auch SendKeys("c",0)

Ich kann es gerade nicht testen, da ich unter Linux bin und alle Funktionen die auf einen Unterstrich _ enden sind Windows API Funktionen.

Code: Alles auswählen

;- Procedure Sendkey

Procedure SendKey(Key.s, AndCtrl=0)   ; ## Änderungen hier : , AndCtrl=0
  ; get virtual key code and shift state 
  VK.w = VkKeyScan_(Asc(Key)) 
  
  If VK = -1 
    ProcedureReturn 
  EndIf 
   
  ; get scan code if an extended key 
  If MapVirtualKey_(VK, 2) = 0 
    Extended.l = #KEYEVENTF_EXTENDEDKEY 
    ; get scan code 
    Scan.l = MapVirtualKey_(VK, 0) 
   Else 
    Extended = 0 
    Scan = 0 
   
  EndIf 
  
  ; press shift/ctrl/alt if needed 
  Shift.l = VK & $100 
  Ctrl.l = VK & $200 
  Alt.l = VK & $400 
  If Shift 
    keybd_event_(#VK_SHIFT, 0, 0, 0) 
  EndIf 
  If Ctrl Or AndCtrl ; ## Änderungen hier : Or AndCtrl
    keybd_event_(#VK_CONTROL, 0, 0, 0) 
  EndIf 
  If Alt 
    keybd_event_(#VK_MENU, 0, 0, 0) 
  EndIf 
  
  ; press and release key 
  VK & $ff 
  keybd_event_(VK, Scan, Extended, 0) 
  keybd_event_(VK, Scan, #KEYEVENTF_KEYUP | Extended, 0) 
  
  ; release shift/ctrl/alt if pressed 
  If Shift 
    keybd_event_(#VK_SHIFT, 0, #KEYEVENTF_KEYUP, 0) 
  EndIf 
  If Ctrl 
    keybd_event_(#VK_CONTROL, 0, #KEYEVENTF_KEYUP, 0) 
  EndIf 
  If Alt 
    keybd_event_(#VK_MENU, 0, #KEYEVENTF_KEYUP, 0) 
  EndIf 
EndProcedure 

; send string to foreground application  
Procedure SendKeys(String.s) 
  For Letter.l = 1 To Len(String) 
    SendKey(Mid(String, Letter, 1)) 
  Next 
EndProcedure 


RunProgram("notepad.exe")
Delay(1000)
SendKeys("abc") ; ## wir tippen abc
; achtung, für Ctrl verwenden wir sendkey, da sendkeys NICHT geändert wurde
SendKey("a",1) ; ## Änderungen hier (Aufruf):  ("a",1) Wir senden Ctrl+A, markieren alles
Delay(500)  ; kleine Pause damit man sieht was passiert
SendKey("c",1)  ; kopieren es
SendKey("v",1)
Delay(500) 
SendKey("v",1) ; wir fügen zweimal abc ein (das Erste mal überschreibt den ausgewählten text)

Re: Sendkey() für STRG + A und STRG+C

Verfasst: 09.02.2016 15:24
von basiszero
Es kommt die Meldung "Falsche Anzahl der Parameter"

In der Procedure Sendkeys() ist auch nur ein Parameter und zwar String angegeben.

Code: Alles auswählen

; send string to foreground application 
Procedure SendKeys(String.s)
  For Letter.l = 1 To Len(String)
    SendKey(Mid(String, Letter, 1))
  Next
EndProcedure

Re: Sendkey() für STRG + A und STRG+C

Verfasst: 09.02.2016 15:27
von NicTheQuick
Deswegen sollst du ja auch die geänderte SendKeys-Procedure nutzen.

Re: Sendkey() für STRG + A und STRG+C

Verfasst: 09.02.2016 15:48
von basiszero
Hallo NicTheQuick,

das habe ich ja auch getan. Trotzdem geht es nicht. Ich könnte die Procedure so abändern.
Fehlermeldung ist verständlicher Halber weg, aber...

Code: Alles auswählen

send string to foreground application 
Procedure SendKeys(String.s,wert)
  For Letter.l = 1 To Len(String)
    SendKey(Mid(String, Letter, 1))
  Next
EndProcedure


RunProgram("notepad.exe")
Delay(1000)
SendKeys("Hallo",0)
Delay(1000)
SendKeys("a",1)  ; ## Änderungen hier (Aufruf)
Aber das bringt auch nicht das gewünschte Ziel...

Re: Sendkey() für STRG + A und STRG+C

Verfasst: 09.02.2016 16:17
von Macros
Hall basiszero,

Ich hatte einen kleinen Fehler (sendkeys statt sendkey) in meinem Beispielcode.
Ich hab ihn oben angepasst,
nun solltest du sehen, wie es funktioniert. Allerdings wieder nicht getestet ;)

Wenn du mit sendkeys auch ctrl Kombinationen senden willst, musst du dir die Funktion anpassen.
Z.B. so, dass er bei einem ^ das Zeichen übergeht und das nächste dann mit CTRL zusammen sendet.

Re: Sendkey() für STRG + A und STRG+C

Verfasst: 09.02.2016 16:40
von basiszero
Hallo Macros,

super, vielen Dank !!!
Jetzt hat es hingehauen :allright:

Sendkey() für STRG + A und STRG+C

Verfasst: 10.02.2016 11:46
von basiszero
Leider doch zu früh gefreut :shock:

Kopieren und einfügen geht wunderbar. Leider funktioniert nach dem ausführen des Programmes die Maus und die Tastatur nicht mehr korrekt.
Beim drehen des Scrollrades der Maus, wird der Bildschirm größer oder kleiner gezoomt, statt die Leiste hoch und runter zu scrollen.
Bei der Tastatur geht der Nummernblock nicht mehr korrekt.

Kann das vielleicht an dem deutschen Tastaturlayout liegen ?