Page 1 sur 2

Sauver le contenu du presse papier puis le remettre

Publié : sam. 27/mars/2004 13:47
par Le Soldat Inconnu
Salut,

un petit coup de main, siouplait :wink:

je souhaite faire ceci :
- sauvegarder le contenu du presse papier
- vider le presse papier
- faire une opération qui nécessite l'utilisation du presse papier (un copier coller ou couper coller mais qui doit être invisible pour l'utilisateur donc j'ai besion de ne pas perdre les infos que l'utilisateur a mis dans le presse papier)
- remettre le contenu original du presse papier

Pour le moment, j'ai fait ceci mais je ne vois pas du tout comment sauver les data contenu dans le presse papier.

Code : Tout sélectionner

If OpenClipboard_(0)
  NbFormat = CountClipboardFormats_()
  Debug "Nombre de format contenu dans le presse papier : " + Str(NbFormat)
  Format = 0
  For n = 1 To NbFormat
    Debug Str(n) + "\"
    Format = EnumClipboardFormats_(Format)
    Nom_Format.s = Space(255)
    GetClipboardFormatName_(Format, @Nom_Format, 255)
    Debug "     Format = " +  Str(Format) + " (" + Nom_Format + ")"
    ClipBoardData = GetClipBoardData_(Format)
    Debug "     Data handle = " + Str(ClipBoardData)
    
  Next

  CloseClipBoard_()
Else
  Debug "Erreur"
EndIf
Je verrai après pour les remettre dedans.
merci.

merci.

Publié : sam. 27/mars/2004 14:58
par brossden
Bonjour

As tu essayé de passer par un bloc mémoire, c'est un trés bon buffer à mon avis ! 8)

Publié : sam. 27/mars/2004 15:09
par Le Soldat Inconnu
certe mais comment je récupère la taille de ma data stocké dans le presse papier ?
c'est ça le hic

Publié : sam. 27/mars/2004 15:22
par brossden
Quel type de clipboard risque d'être dans ton presse papier ?

Publié : sam. 27/mars/2004 18:02
par nico
Est-ce que tu essayes d'échanger des données entre Processus!

Publié : sam. 27/mars/2004 18:55
par Le Soldat Inconnu
Bon, j'explique le pourquoi de la chose

c'est pour mon programme bi-exploreur qui permet d'agencer 2 explorateur win l'un en dessous de l'autre et d'ajouter une barre d'outils à droite

je me sert du presse papier pour permettre d'afficher le dossier afficher dans l'explorateur 1 dans l'explorateur 2

pour cela, je procède en envoyant les infos clavier suivantes :
sur l'explorateur 1
- Alt + D pour aller dans la barre d'adresse
- Ctrl + C pour copier l'adresse
puis je passe sur l'explorateur 2 et je fais
- Atl + D
- Ctrl + V
- Enter

j'ai donc les 2 explorateur qui affiche le même dossier après cette manip
je vais également utilsé ce principe pour ouvrir des dossiers prédéfinis

le problème est que j'ai forcément perdu le contenu du presse papier en faisant ce type d'opération or si l'utilisateur (donc moi ;) ) ouvre un dossier par cette méthode, c'est pour copier qlq chose dedans le plus souvent. donc pas pratique car j'ai perdu ce que je voulais copier.

c'est pour cela que j'aimerais bien pouvoir sauver ce fichu presse papier et le remettre en place une fois l'opération finie

Publié : mar. 30/mars/2004 9:31
par Le Soldat Inconnu
Bon, je vois que j'ai encore posé une colle visiblement :mrgreen:

Publié : mer. 31/mars/2004 12:25
par brossden
Peux tu donner ton code, on trouvera peut être une autre astuc que le copier coller !

Publié : jeu. 01/avr./2004 12:21
par Le Soldat Inconnu
Voilà le code :
http://perso.wanadoo.fr/lesoldatinconnu ... loreur.zip
(fichier zip de 108 ko)

je me sert du copier coller aux lignes suivantes :
- 1146
- 1157
- 1168
- 1181

il sagit du code situé derrière le Case indiqué par les lignes ci-dessus.

c'est ceci si tu te perds dans mon code :

Code : Tout sélectionner

Case #Menu_Operation_1vers2 ; Copier l'explorateur 1 vers l'explorateur 2
        ClearClipboard()
        SetForeGroundWindow(WindowE1)
        Clavier(#PB_ShortCut_D, 2)
        Clavier(#PB_ShortCut_C, 1)
        ; AttenteCopier()
        SetForeGroundWindow(WindowE2)
        Clavier(#PB_ShortCut_D, 2)
        Clavier(#PB_ShortCut_V, 1)
        Clavier(#PB_ShortCut_Return, 0)
Explication des variables :
- WindowE1 : handle de l'explorateur du haut
- WindowE2 : handle de l'explorateur du bas

explication des fonctions :
- SetForeGround : mettre la fen au premier plan
- Clavier : envoyer une touche clavier
Clavier(Touche, ToucheSpecial)
Touche = numéro de la touche
ToucheSpecial = 1 pour Ctrl et = 2 pour Alt

voilà, si tu trouves un autre moyen, je m'incline respectueusement devant toi. (à mon avis, je prend pas trop de risques :wink: , quoi que, ne jamais sous estimer un codeur PureBasic)

Ah oui, mon code ne marche pas avec la version 3.89 beta, et je sais pas pourquoi. d'après Oliv, ça plante au niveau de la création du PopupMenu dans la procedure Fenêtre

Publié : jeu. 01/avr./2004 17:08
par nico
Je viens de trouver ça sur le Net:
Pour encore mieux utiliser le soft du Soldat! :)

Code : Tout sélectionner

Explorateur Windows : 

  Maj + Fléche haut étend la sélection des dossiers/fichiers vers le haut 
  Maj + Flèche bas étend la sélection des dossiers/fichiers ves le bas 
  Maj + Flèches droite ou gauche permet de déplacer l’ascenseur horizontal 
  Alt + double clic sur l’objet sélectionné affiche ses Propriétés 
  Alt + lettre soulignée d’un menu sélectionne le menu 
  Alt + Espace = affiche Menu sytème 
  Ctrl + z = annule la dernière action (rattrape une bourde :-)) 
  Ctrl + a = sélection de tout les éléments d’un volet 
  "*"du pavé numérique = ouvre tous les sous dossiers d’un dossier sélectionné 
  "+" ou Flèche droite du pavé numérique ouvre les sous dossiers du niveau suivant 
  "-" ou Flèche gauche du pavé numérique annule l’ouverture des sous dossiers 
  F4 = ouvre la liste des dossiers 
  F6 = active la colonne suivante 
  F10 = active la barre des menus 
  Retour arrière = ouvre le dossier de niveau supérieur 
  Touche Début sélectionne premier fichier 
  Touche Fin sélectionne dernier fichier 

Publié : jeu. 01/avr./2004 20:19
par nico
voilà, si tu trouves un autre moyen, je m'incline respectueusement devant toi. (à mon avis, je prend pas trop de risques , quoi que, ne jamais sous estimer un codeur PureBasic)
Tu fais un sendmessage:

Code : Tout sélectionner

SendMessage_(HwndEdit, #WM_SETTEXT, 0, "Poste de travail")
Alors tu t'inclines maintenant! 8)

Publié : jeu. 01/avr./2004 21:41
par Invité
question idiote
pourquoi tu utilise pas un fichier perso pour faire tes sauvegardes
et relecture au lieu d'utiliser le presse papier ??
comme ça t'y touche pas au press papier !

:?

en fait il faudrai savoir ou windows ecrit les donnees du presspapier !!
quand tu sait ça tu fait une copie du fameux "dossier ou fichier" qui sert
au presspapier avant d'ecrire dedans !
le tous c'est de savoir ou windows stocke le press papier !!

je cherche ...

c'est tout ce que j'ai trouver d'interressant sur le sujet

http://www.programmationworld.com/site/ ... Numero=200

Mais bon si nico a trouvé !! :D

Publié : jeu. 01/avr./2004 21:49
par nico
Dobro,

Tout le problème est de pouvoir coller dans l'edit de l'explorer le chemin que tu souhaites qu'il affiche où trouver une autre solution.
Actuellement, il passe par le presse-papier pour le faire.

Maintenant, y a plus de pb avec ma soluce! eh..eh...eh

Publié : ven. 02/avr./2004 8:20
par Le Soldat Inconnu
je suis d'accord sur ton idée vu que j'ai essayé,nico , mais je n'arrive pas à obtenir la handle de la zone "edit" de l'explorateur. j'ai essayé de chopé d'abord directement, puis en chopant le handle eds parents mais rien à faire, j'ai pas réussi.
alors si tu me trouves ça aussi, ce serai super. :D
mais pour le moment, ta soluce est un problème également

Publié : ven. 02/avr./2004 11:20
par nico
Effectivement, le message n'était pas compliqué à trouver!
Après avoir tout essayé, j'ai mis la main sur la fonction qui allait bien.
Au final, ça reste simple!, toujours une fois fini bien sûr, c'est navrant!
Dans cet exemple, je n'utilise pas de raccourci clavier pour valider la saisi, c'est encore mieux je pense.

Voilà, un exemple concret avec la vérification du String envoyé à l'Edit.
T'es content, maintenant. :lol:

Code : Tout sélectionner

Global HandleEdit

Procedure EnumChildProc(hWnd.l,lParam.s)
  Tampon.s=Space(50)
  GetClassName_(hWnd, @Tampon, 50)
  Debug "hwnd="+Str(hWnd)+"   "+"ClassName="+Tampon
  If Tampon="Edit"
    Tampon1.s=Space(20)
    SendMessage_(hWnd,#WM_GETTEXT,20,Tampon1)
    ;On vérifie que le contenu de l'edit correspond à chemin(lparam)
    If lParam=Tampon1
      HandleEdit=hWnd
    EndIf
  EndIf
  ProcedureReturn #True
EndProcedure

Chemin.s="C:\"
WindowExploreur = RunProgram("explorer.exe", "/n,/e,"+Chemin+Chr(34), "")
Delay(1000)
FenetreActive.l=GetForegroundWindow_()
EnumChildWindows_(FenetreActive, @EnumChildProc(),Chemin)

Chemin1.s="Poste de travail"
SendMessage_(HandleEdit,#WM_SETTEXT,0,Chemin1)
SendMessage_(HandleEdit,#WM_KEYDOWN,#VK_RETURN,0)
Delay(1000)
Tampon.s=Space(50)
SendMessage_(HandleEdit,#WM_GETTEXT,50,Tampon)
Debug FenetreActive
If Chemin1=Tampon
  MessageRequester("Info","L'Edit a bien reçu Le chemin spécifié!")
EndIf
End