begin process at 2008 05 16 05:05:44
1 173 215 membres
57 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

MIDDLEBUTTON COPYPASTE [ADDIN VB6]


Information sur la source

Catégorie :Trucs & Astuces Classé sous : addins, MiddleButton, Copy, Paste, Copier coller Niveau : Débutant Date de création : 06/05/2008 Date de mise à jour : 10/05/2008 10:28:05 Vu / téléchargé: 1 064 / 66

Note :
Aucune note

Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note


Description

J'avais remarqué que sous UNIX, lorsque l'on sélectionne du texte, grâce au bouton du milieu, ça faisait une sorte de copier coller.

En fait, le mot sélectionné se 'recopie' à l'endroit ou l'on place le curseur.

Le mieux, c'est de l'essayer.

Installation :
Si la dll n'est pas supprimée du zip, lancez simplement le fichier Install.Bat, sinon
il faut ouvrir le projet et compiler la dll.

Conclusion

Base de travail : source d'EBArtSoft et sa MouseWheel
http://www.vbfrance.com/codes/UTILISER-ROULETTE-DANS-VB6-IDE-ADDIN_21802.aspx
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

06 mai 2008 18:38:40 :
Erreur monumentale d'orthographe :$
10 mai 2008 10:28:05 :
** Utilisation de la méthode GetSelection pour récupération du texte sélectionné. | ** Abandon de l'utilisation du Clipboard. | Merci Renfield ;) | Le détail des modifications se trouve dans l'entête du module
  • signaler à un administrateur
    Commentaire de Charles Racaud le 06/05/2008 20:47:11

    Mais c'est super pratique ca. Et je ne connaissais même pas ca sur Linux en plus ^^

    Par contre, j'ai eu un crash lors de la fermeture de l'ide mais celà l'as fait qu'une seule fois. Je n'ai pas réussit à le reproduire. Donc, je sais pas trop d'où ca peu venir.

    Et bon retour parmis nous ^^
    __
    Kenji

  • signaler à un administrateur
    Commentaire de PCPT le 06/05/2008 21:44:29 administrateur CS

    salut mortalino,

    çà peut être pratique, c'est rigolo. un réflexe à prendre sans doute, mais apparemment faut être prudent :
    si j'ai qqc dans le presse papier (image) et que je click-molette sur la form, je me retrouve avec l'image dedans
    une texte, caption sélectionné (propriété), il prend le presse-papier

    apparemment la zone d'action n'est pas "que" le code

    (pas eu de crash mais dés-installée avant la fermeture)

  • signaler à un administrateur
    Commentaire de mortalino le 07/05/2008 04:14:44

    Salut Kenji,

    Oui c'est pratique, il faut s'habituer mais ça permet d'être rapide sur certaines actions (copie de mots, instructions voir un bloc).
    Concernant le plantage que tu as eu, je ne sais pas ce qu'il s'est passé, je n'ai pas (encore) eu de problème.

    Je ne sais pas si c'est propre à Unix ou Linux, mais mon outil de travail au taf est sous Unix, c'est peut-être nos administrateurs système qui ont programmé cette fonction.
    Je leur demanderai à l'occas.

    Salut PCPT,

    j'aime ton terme 'click-molette'  ;)
    J'ai vu effectivement que si tu sélectionnes une propriété (comme le Caption), ce n'était pas pris en compte, ce qui est en fait normal, car seule la fenêtre de code est sous-classée.
    Par contre s'est bizarre ton histoire d'image, je n'ai pas pu le reproduire. Mais j'ai trouvé un bug, tu sélectionnes un contrôle situé sur la Form, tu 'click-molette'  ;)  et ton contrôle est dupliqué. C'était pas prévu  :$

    Pour stabiliser ça et le coup des images, avant de copier coller, je ferai une vérif avec GetSelection (VBIDE)

    Voilà, sinon, perso, jusqu'à présent aucun crash. Par contre j'ai essayé de créer la dll pour vba (en changeant dans le Connect) mais au chargement de vba, j'ai une erreur de compatibilité de type.

    Merci pour vos comms  :p

  • signaler à un administrateur
    Commentaire de Renfield le 07/05/2008 04:20:41 administrateur CS

    l'interêt d'une manipulation differente de Ctrl+C/Ctrl+V, qui se fait naturellement et rapidement, tout de même ^^ serait de ne pas passer par le presse-papier, offrant une sorte de deuxième clipboard.

  • signaler à un administrateur
    Commentaire de mortalino le 07/05/2008 04:26:28

    Salut Renfield,

    en fait ça me gène de passer par le presse papier, à l'origine, je ne voulais récupérer que le texte sélectionné par l'intermédiaire d'une variable, mais GetSelection ne te donne que la position de la sélection, je n'ai pas trouvé le moyen de récupérer le texte. Un indice ?

    ++

  • signaler à un administrateur
    Commentaire de Renfield le 07/05/2008 06:54:13 administrateur CS

    ben tu peux passer par:

    Property Lines(StartLine As Long, Count As Long) As String
        Lecture seule
        Membre de VBIDE.CodeModule
        Renvoie le bloc de lignes spécifié.

  • signaler à un administrateur
    Commentaire de mortalino le 07/05/2008 07:14:20

    merci pour les infos, j'avais pas vu Lines, j'y travaille déjà pour ne récupérer que la sélection.

  • signaler à un administrateur
    Commentaire de moustachu le 07/05/2008 09:20:11

    >Commentaire de Renfield le 07/05/2008 04:20:41
    >Commentaire de Renfield le 07/05/2008 06:54:13
    Heu, t'as arrêté de dormir ?

    Ca m'a l'air pratique ça. Je dois avouer que le Ctrl+C Ctrl+V c'est rapide... trop parfois :o)

    ++
    Moustachu

  • signaler à un administrateur
    Commentaire de cirec le 07/05/2008 09:32:19 administrateur CS

    Salut les djeune's, :)

    si j'ai bien compris cette extension n'est que pour l'IDE VB

    bon moi je ne le possède pas (VB) mais une question me taraude néanmoins: si comme chez moi le click molette est réaffecté à la fermeture des fenêtres (ALT+F4) est ce que ça fonctionne quand même ???

  • signaler à un administrateur
    Commentaire de Renfield le 07/05/2008 09:47:01 administrateur CS

    Moustachu> ben si! je dors.... entre minuit et trois/quatre heures du matin.
    ca laisse du temps libre (entre ma femme, ma fille, etc...)

  • signaler à un administrateur
    Commentaire de mortalino le 07/05/2008 19:37:25

    Salut Cirec,

    excellente question, il faudrait tester !
    Ca a beau être sous-classé, je ne sais pas comment cela fonctionne avec une affectation de click par un programme tiers.

    T'as plus qu'à te mettre à VB pour le savoir  :D

    Ou si quelqu'un d'autre connait la réponse  ;)
    @++

  • signaler à un administrateur
    Commentaire de jack le 07/05/2008 21:52:24 administrateur CS

    Rxcrllrnyr if"r <-- ça c'est quand on écrit dans le noir, lol : allumage
    Excellente idée, Mortalino
    J'utilise aussi beaucoup cette fonctionnalité souris sous OpenVMS. Très pratique, j'adopte !
    Ca fait plaisir de te "revoir" dans le coin !

    Pour ce qui est du Ctrl-C / Ctrl-V : Je ne m'y suis pas adapté : Trop d'erreur de C à la place de V = énervement. J'utilisai la méthode Windows 3.1 : Ctrl-Ins / Shift-Ins qui semble abandonné sur certains logiciels de Microsoft.

  • signaler à un administrateur
    Commentaire de mortalino le 08/05/2008 23:54:40

    Salut Jack, et merci pour ton comm  ;)

    Il est vrai que c'est pratique, dommage que je n'arrive pas à l'adapter pour vba  :(
    (erreur incompatibilité, impossible à débugger vu que la dll est déjà lié en tant que complément à Office)

    J'essaie juste de restaurer le clipboard (voir ne pas l'utiliser, ce serait mieux) mais ça ne fait pas ce que je veux (Topic ouvert d'ailleurs à ce sujet, aujourd'hui).
    On verra si l'avenir m'est favorable  :D

    C & V étant proche, je reconnais qu'il est facile de se mélanger les pinceaux. pareil, sous notre OS, on a F3 pour copier et F4 pour coller. Bien pratique aussi.

    ++

  • signaler à un administrateur
    Commentaire de Renfield le 09/05/2008 08:33:44 administrateur CS

    bouges pas l'ami, je te le corrige ton code.

  • signaler à un administrateur
    Commentaire de Renfield le 09/05/2008 10:36:06 administrateur CS

    a améliorer, mais la base est là... (a toi de modifier pour gérer le SDI)

    Sub HookWindow(ByRef voComponent As VBComponent)
    Dim hMdiWnd As Long
        '# On cherche la fenetre MDI
        hMdiWnd = FindWindowEx(VBInstance.MainWindow.hwnd, 0, WNDNAME, vbNullString)
        '# Et la fenetre de code courante
        mhWnd = FindWindowEx(hMdiWnd, 0, "VbaWindow", voComponent.CodeModule.CodePane.Window.Caption)

        If mhWnd Then
            mhProc = SetWindowLong(mhWnd, GWL_WNDPROC, AddressOf WindowProc)
        End If
    End Sub


    et donc :
    Private Sub CmpHandler_ItemActivated(ByVal VBComponent As VBIDE.VBComponent)
        UnhookWindow
        HookWindow VBComponent
    End Sub

    Private Sub CmpHandler_ItemSelected(ByVal VBComponent As VBIDE.VBComponent)
        UnhookWindow
        HookWindow VBComponent
    End Sub


    ainsi, on hook la fenetre, et non la MDI

    Option Explicit

    Private Const GWL_WNDPROC           As Long = (-4)
    Private Const WM_KILLFOCUS          As Long = &H8
    Private Const WM_LBUTTONDOWN As Long = &H201
    Private Const WM_LBUTTONUP As Long = &H202
    Private Const WM_MBUTTONDOWN As Long = &H207

    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

    Public VBInstance   As VBIDE.VBE
    Private mhWnd As Long
    Private mhProc As Long

    Public Sub HookWindow(ByRef voComponent As VBComponent)
    Dim hMdiWnd As Long
        '# On cherche la fenetre MDI
        hMdiWnd = FindWindowEx(VBInstance.MainWindow.hwnd, 0, WNDNAME, vbNullString)
        '# Et la fenetre de code courante
        mhWnd = FindWindowEx(hMdiWnd, 0, "VbaWindow", voComponent.CodeModule.CodePane.Window.Caption)

        If mhWnd Then
            mhProc = SetWindowLong(mhWnd, GWL_WNDPROC, AddressOf WindowProc)
        End If
    End Sub

    Public Sub UnhookWindow()
        If mhWnd Then
            SetWindowLong mhWnd, GWL_WNDPROC, mhProc
            mhWnd = 0
        End If
    End Sub

    Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim nStartLine As Long
    Dim nStartColumn As Long
    Dim nEndLine As Long
    Dim nEndColumn As Long
    Dim nSelLine As Long
    Dim nSelColumn As Long
    Dim sBuffer As String
    Dim sClipboard As String
    Dim nPos As Long
        Select Case uMsg
            Case WM_MBUTTONDOWN
                With VBInstance.ActiveCodePane
                    '# on récupère la selection (coordonnées)
                    .GetSelection nStartLine, nStartColumn, nEndLine, nEndColumn
                    '# Les lignes de code contenant le texte séléctionné
                    sBuffer = .CodeModule.Lines(nStartLine, nEndLine - nStartLine + 1)
                    '# On découpe en fonction des colonnes
                    If nEndLine <> nStartLine Then
                        nPos = InStrRev(sBuffer, vbNewLine)
                        sClipboard = Mid$(sBuffer, nStartColumn, nPos + 1 - nStartColumn + nEndColumn)
                    Else
                        sClipboard = Mid$(sBuffer, nStartColumn, nEndColumn - nStartColumn)
                    End If
                    '# On transmet le click gauche a la fenetre de code, aux mêmes coordonnées
                    WindowProc = CallWindowProc(mhProc, hwnd, WM_LBUTTONDOWN, wParam, lParam)
                    '# Relache le bouton
                    CallWindowProc mhProc, hwnd, WM_LBUTTONUP, wParam, lParam
                    
                    '# On récupère les coordonnées de l'insertion
                    .GetSelection nSelLine, nSelColumn, nPos, nPos
                    
                    '# On récupère la ligne contenant le curseur de saisie
                    sBuffer = .CodeModule.Lines(nSelLine, 1)
                    '# On supprime cette ligne
                    .CodeModule.DeleteLines nSelLine
                    '# Et on la remplace avec notre version (potentiellement multi-lignes)
                    .CodeModule.InsertLines nSelLine, Left$(sBuffer, nSelColumn - 1) & sClipboard & Mid$(sBuffer, nSelColumn)
                    
                    '# Et justement ; si multiligne et placée en amont de notre selection initiale,
                    If nEndLine <> nStartLine And nSelLine < nStartLine Then
                        '# On décale celle-ci
                        nPos = nEndLine - nStartLine
                        nStartLine = nStartLine + nPos
                        nEndLine = nEndLine + nPos
                    End If
                    
                    '# Et on reselectionne notre texte de départ
                    .SetSelection nStartLine, nStartColumn, nEndLine, nEndColumn
                End With
            Case Else
                WindowProc = CallWindowProc(mhProc, hwnd, uMsg, wParam, lParam)
        End Select
    End Function

  • signaler à un administrateur
    Commentaire de mortalino le 10/05/2008 10:29:55

    Source MAJ
    Merci Renfield ;)

  • signaler à un administrateur
    Commentaire de moustachu le 11/05/2008 09:58:19

    Bonjour,

    Renfield, le ItemActivated ou ItemSelected sont exécutés à quel moment. J'avais posté une source pour sous classer l'IDE de VB mais je ne parvenais pas à sous classer la fenêtre qui n'avait pas été ouverte via l'explorateur de projet.

    ++
    moustachu

  • signaler à un administrateur
    Commentaire de Renfield le 12/05/2008 07:01:05 administrateur CS

    depend de la fenetre en question. Pour ne pas subir de limitations, un hook WH_CBT peut surement faire l'affaire.

    quand tu selectionne un element de la liste "Explorateur de projet" => ItemSelected

    lorsque tu actives une nouvelle fenetre (Form1 (Code) / Form1 ...) => ItemActivated

  • signaler à un administrateur
    Commentaire de moustachu le 14/05/2008 12:13:24

    Bonjour,

    je modifie mon code grâce à celui-ci et ça va mieux. Il reste un problème, c'est quand sélectionnant un item dans le gestionnaire de projet, la fenêtre de code correspondante s'ouvre car on recherche le nom de la fenêtre. Il faudrait pouvoir savoir si la fenêtre de code est ouverte avant d'appeler la procédure Hook.

    ++
    Moustachu

  • signaler à un administrateur
    Commentaire de Renfield le 14/05/2008 14:51:25 administrateur CS

    à regarder via GetWindowClass

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS