Problème avec le ClipBoard, depuis un complément VB6 qui sous-classe VB [Résolu]

mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 8 mai 2008 à 16:05 - Dernière réponse : mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention
- 10 mai 2008 à 01:09
@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA/STRON
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Renfield 17308 Messages postés mercredi 2 janvier 2002Date d'inscription 22 août 2018 Dernière intervention - 9 mai 2008 à 07:35
3
Merci
il ne te faut pas passer du tout par le presse papier.

perso, ca me gène quand j'en perds le contenu... et là, tu ne restaure même que le texte, au pire, donc images, HTML, Excel, Fichiers, .... perdus

les Addins VB6 permettent de lire et ecrire dans le CodePane. ne te gène pas pour le faire par ce biai !

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de Renfield
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 8 mai 2008 à 16:07
0
Merci
Désolé Pb de cache, je recommence...

@++

<hr width="100%" size="2" />( Nouveau forum : Exclusivement Office & VBA/STRON
Commenter la réponse de mortalino
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 8 mai 2008 à 16:15
0
Merci
Bonjour à tous,

on recommence (j'avais mis une tartine en plus..)

Dans ma source Add-in : http://www.vbfrance.com/codes/MIDDLEBUTTON-COPYPASTE-ADDIN-VB6_46574.aspx
je voulais récupérer avant de faire le Ctrl C / Ctrl V le contenu du ClipBoard, afin de le réinjecter après mon 'Click Molette'.
J'ai essayé diverses méthodes, sans succès.

Ce qui est bizarre, c'est que cela fonctionne dans un Executable simple, mais pas dans mon Add-in (est-ce lié au sous-classement ?)

Voici mes 2 méthodes qui échouent, je ne vous liste que le principal :

Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim mWndProc        As Long
    Dim Point           As POINTAPI
    Dim sTextClipboard  As String
    Dim oDataClipboard  As Object

    mWndProc =  GetProp(hwnd, PRPNAME)
    If (mWndProc = 0) Then Exit Function
    
    WindowProc = CallWindowProc(mWndProc, hwnd, uMsg, wParam, lParam)
'METHODE 1
    Select Case wParam
    Case WM_MBUTTONDOWN
        GetCursorPos Point 'récupère X & Y
        
        ' on récupère les données du presse-papier
        sTextClipboard = Clipboard.GetText
        'Set oDataClipboard = Clipboard.GetData
        'Clipboard.Clear
        
        ' simule [CTRL C]
        keybd_event VK_CONTROL, 0, 0, 0
        keybd_event VK_C, 0, 0, 0
        keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
        keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0
        
        ' simule [Clique Gauche]
        mouse_event MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, Point.X, Point.Y, 0, 0
        
        ' simule [CTRL V]
        keybd_event VK_CONTROL, 0, 0, 0
        keybd_event VK_V, 0, 0, 0
        keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
        keybd_event VK_V, 0, KEYEVENTF_KEYUP, 0
        
        'restauration du presse-papier
        'Clipboard.Clear
        'Clipboard.SetData oDataClipboard
        Clipboard.SetText sTextClipboard
    End Select'FIN METHODE 1
'METHODE 2
    Select Case wParam
    Case WM_MBUTTONDOWN
        GetCursorPos Point 'récupère X & Y

        'récupère le texte sélectionné
        VBInstance.ActiveCodePane.GetSelection MyStartLine, MyStartColumn, MyEndLine, MyEndColumn
        NbLines = fNbLines(MyStartLine, MyEndLine)
        sTextOfLines = VBInstance.ActiveCodePane.CodeModule.Lines(MyStartLine, NbLines)
        
        Select Case NbLines
        Case 1
            sTextToInsert = ExtractSelection(sTextOfLines, MyStartColumn, MyEndColumn)

        Case Is > 1
            For i = 1 To NbLines
                If i = 1 Then
                    sTextToInsert = ExtractSelection(sTextOfLines, MyStartColumn) & vbCrLf
                ElseIf i = NbLines - 1 Then
                    sTextToInsert = sTextToInsert & ExtractSelection(sTextOfLines, 1, MyEndColumn)
                Else
                    sTextToInsert = sTextToInsert & ExtractSelection(sTextOfLines, 1) & vbCrLf
                End If
            Next i
        End Select
        
        
        ' on récupère les données du presse-papier
        hStrPtr = GetClipboardData(CF_TEXT)

        If hStrPtr <> 0 Then
            lLength = lstrlen(hStrPtr)
            If lLength > 0 Then
                sTextClipboard = Space$(lLength)
                CopyMemory ByVal sTextClipboard, ByVal hStrPtr, lLength
            End If
        End If
                
        OpenClipboard hwnd
        SetClipboardData CF_TEXT, StrPtr(sTextToInsert)
        
        ' simule [CTRL C]
        keybd_event VK_CONTROL, 0, 0, 0
        keybd_event VK_C, 0, 0, 0
        keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
        keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0
                
        ' simule [Clique Gauche]
        mouse_event MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, Point.X, Point.Y, 0, 0
        
        ' simule [CTRL V]
        keybd_event VK_CONTROL, 0, 0, 0
        keybd_event VK_V, 0, 0, 0
        keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
        keybd_event VK_V, 0, KEYEVENTF_KEYUP, 0
        
        'restauration du presse-papier
        SetClipboardData CF_TEXT, hStrPtr
        CloseClipboard
    
    End Select
    
    Select Case uMsg
    Case WM_KILLFOCUS
        UnhookWindow
        HookWindow
    End Select'FIN METHODE 2

    Select Case uMsg
    Case WM_KILLFOCUS
        UnhookWindow
        HookWindow
    End Select

End Function

~ <small> Mortalino ~ Colorisation automatique </small>

Si vous voyez quelque chose d'érroné ou mal faite, n'hésitez pas
Sinon, ma source restera comme elle est.

Merci pour l'aide que vous pourrez m'apporter

@++

<hr width ="100%" size="2" />( Nouveau forum : Exclusivement Office & VBA/STRON
Commenter la réponse de mortalino
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 8 mai 2008 à 18:03
0
Merci
Re

je tiens à préciser que j'ai une 3 ème méthode (un peu comme la seconde, mais au lieu de faire une simulation de Ctrl V, je parse la ligne d'arrivée pour la réecrire avec InsertLines).


Je me demande, vu que je sous-classe, si il n'y a pas 'mélange' de messages Windows.


J'ai l'impression qu'il n'a pas eu le temps de traiter ma proc, et d'autres messages windows arrivent et peut-être qu'il se mélange les pinceaux.
Enfin, une piste à suivre..

@++





<hr width="100%" size="2" />


( Nouveau forum : Exclusivement Office & VBA/STRON
Commenter la réponse de mortalino
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 9 mai 2008 à 15:34
0
Merci
Merci Renfield pour le bout de code sur la source. Je donnerai suite à ce topic après tests ce soir

@++

<hr width="100%" size="2" />( Nouveau forum : Exclusivement Office & VBA/STRON
Commenter la réponse de mortalino
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 10 mai 2008 à 01:09
0
Merci
http://www.vbfrance.com/codes/MIDDLEBUTTON-COPYPASTE-ADDIN-VB6_46574.aspx#comments



Merci Renfield pour l'aide apportée, qui m'a permis de comprendre pourquoi je n'arrivais pas à mes fins avec mes méthodes (et erreurs).

Pour éviter d'expliquer le pourquoi du comment, j'ai mis plus haut le lien vers les commentaires (lire le 15eme, jusqu'à présent, le plus long [code de Renfield]), les autres comprendront où j'avais faux.
Pas encore MAJ à l'heure de ce post mais dans un futur (très) proche, ce sera fait
(les modifs apportées sont énumérées dans l'entête du module de la source)

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA/STRON
Commenter la réponse de mortalino

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.