coller simulé

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

coller simulé

Message par SPH »

Bonjour,

voici un code qui copie la chaine a$ dans le presse papier :

Code : Tout sélectionner

a$="Bonjour"
SetClipboardText(a$)
;coller
Ma question est : peut on forcer le collage avec une instruction ?

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: coller simulé

Message par Marc56 »

Presque toutes les commandes qui commencent par Set (définir) ont leur opposé Get (saisir)

SetClipboardText <-> GetClipboardText
SetClipboardImage <-> GetClipboardImage

La bibliothèque Clipboard à 5 commandes
http://www.purebasic.com/french/documen ... index.html

Code : Tout sélectionner

a$="Bonjour"
SetClipboardText(a$)
;coller
b$ = GetClipboardText()
Debug b$
Et d'une manière générale, si tu cliques sur un mot clé, que tu appuies sur F1 et que tu va dans le bas de la page d'aide contextuelle, tu as tous les autres mots clés liés.

:)
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: coller simulé

Message par SPH »

Merci mais ce n'est pas exactement ce que je voulais :
Je veux qu'a l'instruction de copie, se copie le texte du presse papier sur le curseur actif de l'ecran (par exemple le curseur en cours du blocnote)

Tu vois la nuance ? 8) :?

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: coller simulé

Message par Marc56 »

Ah, OK.

Si le point d'insertion est dans un objet externe à PB, alors il faut jouer avec les outils de gestion OLE (En PB, il y a la lib tiers ComatePlus)

8)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: coller simulé

Message par falsam »

Marc56 a écrit :Et d'une manière générale, si tu cliques sur un mot clé, que tu appuies sur F1 et que tu va dans le bas de la page d'aide contextuelle,
Marc56, je ne sais pas si tu as vu mais SPH est inscrit sur le forum depuis 2005. Un pilier qui lit tout le forum depuis des années tout en regardant SouthPark avec son thé dans la main.

SPH n'est pas un noob: Ok il ne connait pas les gadgets, mais la touche F1 sur un mot clé il connait (J’espère)

Rassures toi SPH est magnanime et tu es pardonnée jeune effronté. :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: coller simulé

Message par Ar-S »

Du moment ou tu passes sur de la fenêtre externe, tu vas devoir chercher (sous windows) du coté de l'API SendMessage_
Recherche le terme dans le forum il y a plein d'exemples.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: coller simulé

Message par falsam »

1 - Vu que tu donnes peu d'information, on va supposer que tu colles dans le bloc note standard de windows (notepad.exe)
2 - d'après ce que tu dis notepad est déja ouvert.

Tu vas commencé par recherché le handle de Notepad à l'aide de l'API FindWindow.

Code : Tout sélectionner

hwnd = FindWindow_("notepad",#Null)
Notepad comprenant plusieurs composantes (Fenêtres filles), on va rechercher l'Edit à partir de son handle (hwnd) à l'aide de l'API FindWindowEx.

Code : Tout sélectionner

subhwnd=FindWindowEx_(hwnd, #Null, "Edit", #Null)
Maintenant qu'on connait le handle de l'edit (subhwnd, on va coller le contenu de ta variable à l'aide de l'API SendMessage.

Code : Tout sélectionner

SendMessage_(subhwnd, #WM_PASTE, 0, 0)
■ Le code complet

Code : Tout sélectionner

;Ton code 
a$="Bonjour"
SetClipboardText(a$)
;coller
b$ = GetClipboardText()
;Debug b$

;Vu que tu donnes peu d'information, on va supposer que tu colles dans le bloc note de windows

;Recherche du bloc note suposé ouvert (notepad.exe)
hwnd = FindWindow_("notepad",#Null)

If hwnd
  ;Ho Yeahhhh trouvé 
  ;On cherche le componsant principal de l'application qui est l'editeur (Edit)
  subhwnd=FindWindowEx_(hwnd, #Null, "Edit", #Null)
  
  ;Et on colle (Paste)
  SendMessage_(subhwnd, #WM_PASTE, 0, 0)
EndIf

  

Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: coller simulé

Message par nico »

Simulation du ctrl+v et tu n'auras pas besoin de connaitre la fenetre.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: coller simulé

Message par SPH »

nico a écrit :Simulation du ctrl+v et tu n'auras pas besoin de connaitre la fenetre.
C'est exactement ce que je demande : comment SIMULER ctrl+v !?

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: coller simulé

Message par nico »

Compiler sous unicode.

Code : Tout sélectionner

#KEYEVENTF_UNICODE = 4

Procedure.l KeyCombi(Ctrl.l, Alt.l, Shift.l, WinKey.l, key.a)
  Protected Extended.l, Scan.l, Scancode.w, j.l=-1, Nb.l, Win.l
  Protected Dim SendInputData.INPUT(0)
  
  If MapVirtualKey_(key, 2) = 0  ;MAPVK_VK_TO_CHAR=2
    Extended.l = #KEYEVENTF_EXTENDEDKEY
    ; get scan code
    Scan.l = MapVirtualKey_(key, 0)  ;MAPVK_VK_TO_VSC=0
    Scancode.w=Scan & $FFFF
  Else
    Extended = 0
    Scancode = 0
  EndIf
  
  If WinKey
    Win = 1
  EndIf
  
  Nb=(Ctrl + Alt + Shift + Win)*2
  If Key
    Nb = Nb + 2
  EndIf 
  
  ReDim SendInputData.INPUT(Nb)
  
  If Ctrl 
    j=j+1     
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_CONTROL
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf 
  
  If Alt
    j=j+1   
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_MENU
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If Shift 
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_SHIFT
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If WinKey = 1 
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_LWIN
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If WinKey = 2 
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_RWIN
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If Key 
    j=j+1  
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= Key
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE|Extended
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = Scancode
    
    j=j+1
    SendInputData(j)\Type = #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk = Key
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE|#KEYEVENTF_KEYUP|Extended
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = Scancode
  EndIf 
  
  If Shift 
    j=j+1     
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_SHIFT
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE|#KEYEVENTF_KEYUP
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If Alt 
    j=j+1     
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_MENU
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE|#KEYEVENTF_KEYUP
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If Ctrl
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_CONTROL
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE|#KEYEVENTF_KEYUP
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf 
  
  If WinKey = 2 
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_RWIN
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If WinKey = 1 
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_LWIN
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  SendInput_(Nb, SendInputData(0), SizeOf(INPUT))
  
EndProcedure

Delay(5000)
KeyCombi(1, 0, 0, 0, #VK_V)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: coller simulé

Message par Marc56 »

SPH a écrit :C'est exactement ce que je demande : comment SIMULER ctrl+v !?
Same player play again, je retente ma chance :mrgreen:

Installe un gestionnaire de macro genre autohotkey
(il y en a des d'autres plus légers, il suffit de chercher "text expansion windows")

Pour AHK, Ajoute dans le script, par exemple

Code : Tout sélectionner

::;copie::
^V
Pour d'autres gestionnaires de macro, la syntaxe est par exemple
xxx={controldown}V{controlup}

Sauvegarde, fais Reload sur l'icone.
Chaque fois que tu écrira ;copie il fera ctrl+v (peu importe dans quelle application)

Mais tu as intérêt à mettre des mots qui ne sont pas courant, ou alors désactiver chaque fois que tu te t'en sert pas.
:?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: coller simulé

Message par falsam »

Alors là je n'ai rien compris SPH. Le code que j'ai posté en PureBasic simule ton Ctrl+V. Qu'est ce qu'il te faut de plus ?

Le lien au cas ou tu aurais lu en diagonal http://www.purebasic.fr/french/viewtopi ... 15#p171415
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: coller simulé

Message par SPH »

falsam a écrit :Alors là je n'ai rien compris SPH. Le code que j'ai posté en PureBasic simule ton Ctrl+V. Qu'est ce qu'il te faut de plus ?

Le lien au cas ou tu aurais lu en diagonal http://www.purebasic.fr/french/viewtopi ... 15#p171415
Si si, j'ai vu ton code. En fait, il y a eu un deluge de reponse et je ne sais pas ou donner de la tete.
Bon, j'avoue, j'ai triché : ce n'etait pas dans notepad que je voulais copier le presse papier mais dans chrome. Dans ton tchat precisement. J'ai remplacé le mot NOTEPAD par CHROME dans ton code mais bien sur, ca n'a pas marché.
Enfin, qqun m'a donné ce code qui me conviens :

Code : Tout sélectionner

res = keybd_event_(#VK_CONTROL,0,0,0)   ;" Appuyer sur CTRL
res = keybd_event_(#VK_V,0,0,0)         ;" Appuyer sur V
res = keybd_event_(#VK_V,0,2,0)         ;" Relacher V
res = keybd_event_(#VK_CONTROL,0,2,0)   ;" Relacher CTRL
Merci a tous pour vos reponses, je les testerais tous 8)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: coller simulé

Message par falsam »

La prochaine fois donne plus de précision dans ce cas.
SPH a écrit :e veux qu'a l'instruction de copie, se copie le texte du presse papier sur le curseur actif de l’écran (par exemple le curseur en cours du blocnote)
Blocnote non ? Ha pardon fallait comprendre une web application interpréter par chrome Chrome !!
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: coller simulé

Message par Marc56 »

En passant, merci à toi falsam pour cet exemple clair et bien commenté sur l'utilisation des API FindWindow, FindWindowEx, SendMessage.
Je n'avais jamais bien compris leur utilisation car c'est souvent perdu dans un fouillis d'explications et rarement en français.
Ça m'ouvre d'autres horizons pour l'automation via PB.
Je met ça dans mon bloc note (et vais pouvoir comprendre un peu mieux les données de AutoIt Windows info) :P
Répondre