[experts] Faire un UserControl pour le SysTray

Résolu
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 7 juin 2007 à 20:18
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 8 juin 2007 à 22:22
Violent Ken
Bonjour à tous, j'ai un petit bug...
Si un expert en VB6 passe ici et qu'il a 5 minutes pour chercher sur le problème, ce serait super sympa ;)

J'expose le truc : j'ai codé un UserControl pour afficher des icones dans le SysTray.

Comme je dois réafficher les icones quand Explorer crashe, j'ai fais un hook du message TaskbarCreated et j'ai donc besoin d'une WindowProc toute fraiche pour recevoir le message...

Donc je dois subclasser, et comme c'est pas possible de récupérer l'adresse d'une fonction dans un UserControl (à cause de AddressOf exclusif aux *.bas), j'utilise un fonction de CallBack dans un module (classique jusque là).

Mais comme je dois libérer les events du UserControl à partir de cette Proc située HORS du UserControl, je fais appel à une collection d'objets dont un que je recréé temporairement avec CopyMemory depuis un pointeur...
 

J'en viens au bug :
- en compilé, tout marche nickel (sauf le message hooké pour la taskbar, qui n'est pas envoyé, mais bon...)
- en non compilé, VB6 arrive a libérer un event (donc la création temporaire de l'objet est bonne), mais au moment de supprimer l'objet temporaire via CopyMemory.... CRASH.

J'ai cherché deux heures, je sais plus quoi faire... Une idée svp ?
Ci joint le source qui plante : http://files-upload.com/279783/MSSCCPRJ.zip.html

@+ et merci

Hex Editor VB

10 réponses

xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007
8 juin 2007 à 00:34
Salut,
Si tu remplaces la ligne qui supprime l'objet par
Call CopyMemory(Tim, CLng(0), 4)

ça ne plante plus.
Je crois que le 0 seul est un Integer, donc 2 octets, et lire 4 octets peut provoquer n'importe quoi.
3
xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007
8 juin 2007 à 01:51
J'ai fait des tests et j'ai trouvé deux autres problèmes :
- Pour que le message arrive, il faut subclasser une fenêtre de premier niveau (c'est à dire un objet Form). Windows n'envoie apparemment pas le message aux contrôles.
- Dans TrayCallBackFunction, "c'est bien lParam qui contient le message", mais seulement pour les messages qui concernent l'icône. Le message lTaskBarCreated est dans uMsg.
Avec ça, j'espère que ça va marcher.
3
xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007
8 juin 2007 à 22:20
Salut,
c'est juste un petit détail.
Change la dernière ligne de la procédure de callback pour récupérer la valeur de CallWindowProc
TrayContainerCallBackFunction = CallWindowProc(OldOne, HWnd, uMsg, wParam, lParam)

Et tout marche parfaitement.
3
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
7 juin 2007 à 22:59
Salut,

C'est la premiere fois que j'ai l'honneur de te parler (bravo pour toutes tes tres bonnes sources), "classique jusque là", euh oui je veux bien te croire.

La, tu m'as deprimé avec ton post. Je suis tres loin de ca (les mots tous separés, ca va, mais alors une fois réunis, je suis a la ramasse totale, il suffirait peut etre de s'y mettre).

J'espere que tu ne seras pas decu en voyant que tu as une reponse et qu'elle ne t'apporte rien si ce n'est un peu de reconfort.

Tu as cherché 2 heures. Bah si tu attends une reponse de moi, attends 2 ans et j'aurais peut etre un truc pour toi LOL.

Bon j'arrete mes betises. Bonne chance.
0

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

Posez votre question
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
7 juin 2007 à 23:11
Violent Ken
Salut, merci pour ton post, çà fait plaisir ;)

Pas grave si çà résoud pas mon bug, de toutes façons j'ai trop galéré pour ce soir avec le TraySystem !

Et courage, on progresse vite en VB ^^

Bonne soirée et merci, @+

Hex Editor VB
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
8 juin 2007 à 10:39
Violent Ken

Salut,

"Je crois que le 0 seul est un Integer, donc 2 octets, et lire 4 octets peut provoquer n'importe quoi." ==> Superbe ! Tu as résolu le problème du crash ! MERCI, je n'aurais jamais trouvé ;)
Il reste le problème dû au fait que le message lTaskBarCreated n'est pas intercepté par le controle, en effet.
J'ai regardé l'état de tous les paramètres, ni uMsg ni lParam ne changent (donc le controle n'intercepte rien). L'explication vient donc certainement que çà doit être une Form qui doit capter le message, et pas un UserControl.
Je sais pas trop comment remédier à çà, je vais y réfléchir.
Quoi qu'il en soit, merci encore pour la résolution du bug !
@+
Hex Editor VB
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
8 juin 2007 à 18:50
Violent Ken
Alors effectivement, lTaskBarCreated est bien intercepté si je subclasse une form (container) depuis l'UserControl. Par contre plusieurs autres messages ne le sont plus...
@+

Hex Editor VB
0
xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007
8 juin 2007 à 21:46
Déjà, est-ce que tu as fait le remplacement dans la fonction AddToTray
.HWnd = UserControl.HWnd
par
.HWnd = <la fenêtre sous-classée>.HWnd
Sinon, quel message exactement n'est pas intercepté ?
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
8 juin 2007 à 21:56
Violent Ken
Salut,
oui, j'ai récupéré le ContainerHwnd.
Le lTaskBarCreated est bien récupéré, çà fonctionne très bien de ce côté là, mais c'est le sous-classement de la Form qui est mauvais. Par exemple, plus possible d'agrandir ou fermer la Form...etc.
Lien : http://www.mediafire.com/?4ydjetn4xim@+

Hex Editor VB
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
8 juin 2007 à 22:22
Violent Ken
Rooo, je suis trop bête ! Effectivement c'était çà ;)

Je sais pas trop quoi dire à part MERCI ! Vraiment super cool, merci !
@+

Hex Editor VB
0
Rejoignez-nous