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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
basiszero
Beiträge: 13
Registriert: 08.02.2016 13:12

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

Beitrag von basiszero »

Hallo RSBasic,

Danke für den Hinweis...
Ich habe mit deiner Hilfe den Fehler im Code gefunden.

Vielen vielen Dank :allright:

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)
Antworten