INTERDIRE COPIER/COLLER SUR TEXTBOX

Résolu
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 - 24 mars 2005 à 23:19
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005 - 18 juin 2005 à 21:52
Bonjour,

J'aimerai savoir s'il existe un moyen d'interdire la fonction Coller sur une textbox.
Je veux interdire certain caractères. Je les ai bloqué dans la fonction KeyPress
Mais je viens de me rendre compte que l'on peut contourner le pb avec un copier/coller

Merci d'avance

Bonne prog
++

13 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 mars 2005 à 09:26
Salut,
pas besoin de hook, un vulgaire sous classement de fenêtre suffira. Vous essaierez vous mêmes la traduction VB, c'est pas mon truc.

Une variable globale dans le module:
WNDPROC oldProcEd; // en C
en VB: Dim oldProcEd As Long ' devrait aller

la fonction callback, laisse passer tous les messages à l'exception de WM_PASTE:
LRESULT CALLBACK EdProcNoPaste(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
{
if(mssg == WM_PASTE) return 0;
return CallWindowProc(oldProcEd, hwnd, mssg, wParam, lParam);
}

Dans votre FormLoad, initialiser le pointeur de fonction en changeant le callback original du EDIT pour qu'il aille sur la nouvelle:
oldProcEd = (WNDPROC) SetWindowLong(votreEdit.hwnd, GWL_WNDPROC, (long) EdProcNoPaste);

voilà, le tour est joué.

ciao...
BruNews, MVP VC++
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
25 mars 2005 à 06:28
Avec une fonction de Hook ou peut-être avec un menu qui possède le
raccource CTRL+V il est possible de rediriger le collage pour
l'annuler.

DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
28 mars 2005 à 12:54
Ok merci a tous les deux je vais essayer de mettre ça en place. Je pense que la solution de BruNews est plus appropriée étant donné que j'utilise un control utilisateur.
J'espere juste etre capable de mettre ça en place.

Merci encore a tous les 2.

Bonne prog
++
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
28 mars 2005 à 14:40
Yes j'ai reussi mais pas sans mal.
Merci BruNews et merci à Renfield pour sa superbe DLL.
Merci également à DARKSIDIOUS même si je n'ai pas retenu son idée.

Bonne prog
++
0

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

Posez votre question
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
31 mai 2005 à 14:28
Je suis beaucoup intéressé par ce bout de code... Par contre, est-ce
que quelqun pourrait faire la conversion en VB, soit Bouv ou autre.
Parceque je comprend pas trop ce langage...



Merci d'avance!



--------------

la fonction callback, laisse passer tous les messages à l'exception de WM_PASTE:

LRESULT CALLBACK EdProcNoPaste(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)

{

if(mssg == WM_PASTE) return 0;

return CallWindowProc(oldProcEd, hwnd, mssg, wParam, lParam);

}



Dans
votre FormLoad, initialiser le pointeur de fonction en changeant le
callback original du EDIT pour qu'il aille sur la nouvelle:

oldProcEd = (WNDPROC) SetWindowLong(votreEdit.hwnd, GWL_WNDPROC, (long) EdProcNoPaste);

---------
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
1 juin 2005 à 15:11
danielgrd>>
J'ai utilisé la DLL de Renfield ReySubclasser que tu trouvera assez facilement sur ce site.
Le code que j'utilise :

Dim WithEvents SubClasser As ReySubClasser


Private Sub Form_Initialize()
'On initialise le sous classement
Set SubClasser = New ReySubClasser
call SubClasser.Controls.Add (TxtBox.hWnd)
call SubClasser.Messages.Add (WM_PASTE)
call SubClasser.StartSubClassing
End Sub


'On arrete le sous classement
Private Sub Form_Terminate()
call SubClasser.StopSubClassing
Set SubClasser = Nothing
End Sub


'On recupere le message de sous classement et on le traite
Private Sub SubClasser_Msg1(ByVal hWnd As Long, ByVal uMsg As Rey_SubClasser.MessageConstants, ByVal wParam As Long, ByVal lParam As Long, MsgBehavior As Rey_SubClasser.MsgBehaviorConstants, RetValue As Long, ByVal OldProc As Long)
'Si on recupere l'evenement COLLER on vide le presse-papier
If uMsg = WM_PASTE Then Call Clipboard.SetText ("")
End Sub



Bonne prog
++
0
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
6 juin 2005 à 16:22
Bonjour Bouv,



Merci pour la réponse... Je ne l'avais pa vue!



J'ai par contre une question, comment je fais pour incorporer la .DLL
de Renfield dans mon projet? J'ai trouvé le Dll mais pas comment
l'insérer dans un projet...



Merci d'avance
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
6 juin 2005 à 21:26
Tu va dans le menu Projet, puis Référence
et tu coche la case Rey_SubClasser

Pense bien a redistribuer la dll avec tes applis

Bonne prog
++
0
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
17 juin 2005 à 22:57
Bonjour,



Mon programme, une fois compilé en .EXE à toujours bien fonctionné... Mais je l'avais toujours testé sur le même ordinateur...



Il y a quelques jours j'ai décidé de le tester sur un autre ordi...



Et là, avant même que mon logiciel s'exécute, j'obtiens le message d'erreur suivant :

'Vous ne disposez pas de la licence appropriée pour utiliser cette fonctionnalité'



Et ensuite cela quitte....



Après des d'intenses recherches, j'en suis venu à l'évidence que le problème viens de ici:

------------------

Private Sub Form_Initialize()

If SIP2 = 0 Then

Set SubClasser = New ReySubClasser

Call SubClasser.Controls.Add(Text_Msg.hWnd)

Call SubClasser.Controls.Add(Text_Sujet.hWnd)

Call SubClasser.Messages.Add(WM_PASTE)

Call SubClasser.StartSubClassing

End If

End Sub

----------------



En effet, lorsque je supprime cette partie ou la remplace par n'importe quoi d'autre:

----------

Set SubClasser = New ReySubClasser

Call SubClasser.Controls.Add(Text_Msg.hWnd)

Call SubClasser.Controls.Add(Text_Sujet.hWnd)

Call SubClasser.Messages.Add(WM_PASTE)

Call SubClasser.StartSubClassing

------------



Mon programme s'ouvre et aucun problème à l'horizon...



C'est bizarre parcequ'il ne s'agit pas d'un problème de .DLL parcequ'en
supprimant ces 5 lignes j'ai laissé la référence Rey_Subclasser
(rey_subclasser.dll) dans mon prog....



J'ai essayé d'effacer ligne par ligne les 4 dernières lignes pour voir
si ce n'était que l'une d'elle qui causait le problème mais en vain...
L'erreur persiste... Cela doit donc provenir de la 1ere ligne et donc
il faut absolument supprimer les 5 lignes...



J'ai essayé de le faire exécuter lors du chargement (Form_Load) au lieu
de avant (Form_Initialize), je ne sais pas si cela aurais quand même
fonctionné, mais de toute manière j'obtient une autre erreur : Erreur
d'exécution 429... Et même en se consacrant à résoudre cette deuxième
erreur on ne sais pas si la première referra son apparition par
après...!!!



Donc mieux vaut, à mon avis, se consacrer qu'à la première erreur...



En tout cas... Je vais aller réécrire ce post dans les commentaires de
la source officielle Rey_SubClasser de Renfield... Au cas ou...



Merci d'avance...
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
18 juin 2005 à 13:32
As tu bien enregistré la DLL sur le nouveau PC (regsvr32 ...) ?
Sinon voit cela avec Renfield.

Bonne prog
++
0
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
18 juin 2005 à 20:47
Ah et bien c'est sûrement cela... Je viens de tester et maintenant ça marche!!!



Je te remerci!!!



Est-il possible faire enregistrer la DLL en language Visual Basic?

(Par exemple ce qui serait facile a faire, dans un fichier .INI
indiquer si la DLL a été enregistré si elle ne l'est pas et bien
l'enregistrer pour ensuite indiquer dans le .INI qu'elle l'a étée...)



Mais est-il possible d'effectuer la commande Regsvr32 en Visual Basic???



Merci d'avance...
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
18 juin 2005 à 21:11
Il te suffit de faire un shell "RegSvr32 /s nomdeladll" a chaque
lancement avant que ta dll soit liée à ton projet (procédure Sub Main
par exemple).

DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
0
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
18 juin 2005 à 21:52
Merci beaucoup!!!
0
Rejoignez-nous