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

Résolu
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 8 mai 2008 à 16:05
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 10 mai 2008 à 01:09
@++

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

6 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 mai 2008 à 07:35
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 !
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
8 mai 2008 à 16:07
Désolé Pb de cache, je recommence...

@++

<hr width="100%" size="2" />( Nouveau forum : Exclusivement Office & VBA/STRON
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
8 mai 2008 à 16:15
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
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
8 mai 2008 à 18:03
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
9 mai 2008 à 15:34
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
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
10 mai 2008 à 01:09
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
0
Rejoignez-nous