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

Für allgemeine Fragen zur Programmierung mit PureBasic.
basiszero
Beiträge: 13
Registriert: 08.02.2016 13:12

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

Beitrag 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:
Zuletzt geändert von basiszero am 10.02.2016 12:24, insgesamt 3-mal geändert.
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

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

Beitrag 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.
Bild
basiszero
Beiträge: 13
Registriert: 08.02.2016 13:12

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

Beitrag 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")

Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

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

Beitrag 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)
Zuletzt geändert von Macros am 09.02.2016 16:16, insgesamt 2-mal geändert.
Bild
basiszero
Beiträge: 13
Registriert: 08.02.2016 13:12

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

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag von NicTheQuick »

Deswegen sollst du ja auch die geänderte SendKeys-Procedure nutzen.
basiszero
Beiträge: 13
Registriert: 08.02.2016 13:12

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

Beitrag 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...
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

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

Beitrag 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.
Bild
basiszero
Beiträge: 13
Registriert: 08.02.2016 13:12

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

Beitrag von basiszero »

Hallo Macros,

super, vielen Dank !!!
Jetzt hat es hingehauen :allright:
basiszero
Beiträge: 13
Registriert: 08.02.2016 13:12

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

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