Seite 2 von 2
Re: Sendkey() für STRG + A und STRG+C
Verfasst: 10.02.2016 11:53
von RSBasic
Das klingt so, als ob du #KEYEVENTF_KEYUP vergessen hast.
Wenn du einen Tastendruck simulieren möchtest, musst du immer einmal "reindrücken" und einmal wieder loslassen.
Beispiel:
Code: Alles auswählen
keybd_event_(#VK_A, #Null, #Null, #Null) ;Drücken
keybd_event_(#VK_A, #Null, #KEYEVENTF_KEYUP, #Null) ;Loslassen
Wenn du nur den Tastendruck simulierst, ohne danach mit #KEYEVENTF_KEYUP loszulassen, dann bleibt die Taste weiterhin gedrückt und dann passiert genau das, was du hattest.
Du hast zwei Tasten simuliert. Einmal die Strg-Taste und einmal die C-/V-Taste. Wenn die Strg-Taste aber nicht mehr manuell losgelassen wird, dann hast du beim Scrollen automatisch die folgende Tastenfolge: Strg + Scrollrad
Das bedeutet automatisch ein Zoomen.
Re: Sendkey() für STRG + A und STRG+C
Verfasst: 10.02.2016 12:23
von basiszero
Hallo RSBasic,
Danke für den Hinweis...
Ich habe mit deiner Hilfe den Fehler im Code gefunden.
Vielen vielen Dank
Hier nochmal der funktionsfähige Code:
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 Or AndCtrl
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)