MIDDLEBUTTON COPYPASTE [ADDIN VB6]

Utilisateur anonyme - 6 mai 2008 à 20:47
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 21 mai 2008 à 19:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/46574-middlebutton-copypaste-addin-vb6

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
21 mai 2008 à 19:10
Salut,

juste pour info, ce n'est pas mes administrateurs systèmes qui ont programmé la chose, apparemment ça fait parti d'Applix, sous Unix..

J'en sais pas plus, je n'ai aucune connaissance de cet os
++
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 mai 2008 à 14:51
à regarder via GetWindowClass
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
14 mai 2008 à 12:13
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
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mai 2008 à 07:01
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
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
11 mai 2008 à 09:58
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
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 à 10:29
Source MAJ
Merci Renfield ;)
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 à 10:36
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
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 à 08:33
bouges pas l'ami, je te le corrige ton code.
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 à 23:54
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.

++
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 mai 2008 à 21:52
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.
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
7 mai 2008 à 19:37
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 ;)
@++
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 mai 2008 à 09:47
Moustachu> ben si! je dors.... entre minuit et trois/quatre heures du matin.
ca laisse du temps libre (entre ma femme, ma fille, etc...)
Utilisateur anonyme
7 mai 2008 à 09:32
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 ???
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
7 mai 2008 à 09:20
>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
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
7 mai 2008 à 07:14
merci pour les infos, j'avais pas vu Lines, j'y travaille déjà pour ne récupérer que la sélection.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 mai 2008 à 06:54
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é.
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
7 mai 2008 à 04:26
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 ?

++
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 mai 2008 à 04:20
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.
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
7 mai 2008 à 04:14
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
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 mai 2008 à 21:44
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)
Utilisateur anonyme
6 mai 2008 à 20:47
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
Rejoignez-nous