Empecher certain charactere dans une boite de texte

Signaler
Messages postés
40
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
29 décembre 2004
-
Messages postés
40
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
29 décembre 2004
-
J'aimerai empecher l'utilisateur de taper certain charactere dans une boite de texte.

J'ai essayer d'intercepter les messages envoyer au TEXTBOX et en gardant l'adresse de l'ancienne WndProc mais lorsque ma nouvelle WndProc recoie le message WM_SETTEXT la ligne:

return CallWindowProc((WNDPROC)GetWindowLong(hWnd, GWL_USERDATA), hWnd, iMsg, wParam, lParam);

fait l'erreur suivante:
First-chance exception at 0x00000001 in BoxEdit.exe: 0xC0000005: Access violation reading location 0x00000001.

Merci d'avance

PinkRabbit

16 réponses

Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Tu sous classes, et lors de la reception du msg WM_CHAR, tu verifie les caracteres.

+2(p - n)
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Au fait, c lorsk tu fais SetClassLong(...) pour sous classer kil te faut recuperer l'ancien WNDPROC de ton textbox :

//En global
WNDPROC oldproc;

oldproc = SetClassLong(..);

...
return CallWindowProc(olproc, hwnd, message, wparam, lparam);

Voila

+2(p - n)
Messages postés
40
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
29 décembre 2004

c'est ca que j'essayais de faire, mais comem je l'ai explquer dans mon message,

return CallWindowProc((WNDPROC)GetWindowLong(hWnd, GWL_USERDATA), hWnd, iMsg, wParam, lParam);

genere une erreur lorsque c'est le message WM_SETTEXT

LRESULT CALLBACK RenameProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{

return CallWindowProc((WNDPROC)GetWindowLong(hWnd, GWL_USERDATA), hWnd, iMsg, wParam, lParam);
}

tout les autres messages passent mais pas lui... quelqu'un a un idee??
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Atta, excuse moi, jme trompe ptet, mais c koi ca : GetWindowLong(hWnd, GWL_USERDATA) ??

Tu voudrais pas plutot mettre GWL_WNDPROC ?

+2(p - n)
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Et pis dsl, mais c pas tout a fait ce ke je t'ai dit de faire plus haut...Avec ce ke je t'ai dit, c sur, tout marche.

+2(p - n)
Messages postés
40
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
29 décembre 2004

Non c'est bien GWL_USERDATA que je voulais mettre, car j'ai garder l'addresse de l'ancienne WndProc dans le UserData de la fenetre
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
L'ancienne WndProc est donnée par l'appel de SetWindowLongPtr, comme te l'a dit AlexMan
Messages postés
40
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
29 décembre 2004

Je sais ca, le probleme c'est pas ma function RenameProc. Elle marche! C'est quand elle recoie le message WM_SETTEXT que CallWindowProc deconne.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est bête d'appeler a chaque fois GetWindowLong plutot que d'utiliser une variable globale oldProc
Fais-tu quelque chose de spécial quand tu recois WM_SETTEXT?
Messages postés
40
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
29 décembre 2004

Non rien.. en fait ma function RenameProc est encore vide:

LRESULT CALLBACK RenameProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
return CallWindowProc((WNDPROC)GetWindowLong(hWnd, GWL_USERDATA), hWnd, iMsg, wParam, lParam);
}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Mais cette erreur tu dois l'avoir aussi avant de sous-classer dans ce cas la!
C'est un SetWindowText que tu fais?
Messages postés
40
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
29 décembre 2004

Non sans sous-classer tout marche

Oui c'est un SetWindowText
Messages postés
40
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
29 décembre 2004

J'ai mis, comme AlexMAN l'avait dit:

// En global
WNDPROC OldWndProc

et ca marche la...

pointeur pointait surement n'import'ou
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
J'ai fait un test chez moi, marche très bien.
Vérifie que tu as changé la WndProc de l'edit avec SetWindowLong et non pas SetClassLong
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Si tu lui a rien mis, aucune raison que GetWindowLong(hWnd, GWL_USERDATA) te donne l'adresse de la WndProc par défaut!
Messages postés
40
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
29 décembre 2004

lol, je sais, j'y avait storer l'ancienne WndProc.. je comprend juste pas pourquoi elle ne me donnais pas la bonne addresse