INTERDIRE COPIER/COLLER SUR TEXTBOX [Résolu]

bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 24 mars 2005 à 23:19 - Dernière réponse : danielgrd 47 Messages postés mercredi 15 janvier 2003Date d'inscription 22 juin 2005 Dernière intervention
- 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
++
Afficher la suite 

13 réponses

Meilleure réponse
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 25 mars 2005 à 09:26
3
Merci
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++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 25 mars 2005 à 06:28
0
Merci
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/
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 28 mars 2005 à 12:54
0
Merci
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
++
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 28 mars 2005 à 14:40
0
Merci
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
++
danielgrd 47 Messages postés mercredi 15 janvier 2003Date d'inscription 22 juin 2005 Dernière intervention - 31 mai 2005 à 14:28
0
Merci
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);

---------
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 1 juin 2005 à 15:11
0
Merci
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
++
danielgrd 47 Messages postés mercredi 15 janvier 2003Date d'inscription 22 juin 2005 Dernière intervention - 6 juin 2005 à 16:22
0
Merci
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
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 6 juin 2005 à 21:26
0
Merci
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
++
danielgrd 47 Messages postés mercredi 15 janvier 2003Date d'inscription 22 juin 2005 Dernière intervention - 17 juin 2005 à 22:57
0
Merci
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...
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 18 juin 2005 à 13:32
0
Merci
As tu bien enregistré la DLL sur le nouveau PC (regsvr32 ...) ?
Sinon voit cela avec Renfield.

Bonne prog
++
danielgrd 47 Messages postés mercredi 15 janvier 2003Date d'inscription 22 juin 2005 Dernière intervention - 18 juin 2005 à 20:47
0
Merci
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...
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 18 juin 2005 à 21:11
0
Merci
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/
danielgrd 47 Messages postés mercredi 15 janvier 2003Date d'inscription 22 juin 2005 Dernière intervention - 18 juin 2005 à 21:52
0
Merci
Merci beaucoup!!!

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.