utiliser un Hook dans un programme wxWidgets - C++ - Programmation
Marsh Posté le 19-07-2006 à 21:10:14
ReplyMarsh Posté le 19-07-2006 à 21:48:16
tu pourrais poster l'ensemble de ton code, histoire que je teste ?
(big flemmard inside)
Marsh Posté le 19-07-2006 à 23:33:38
pas de probleme.... alors je pose le cadre vite fait
c'est un soft de bureaux virtuel que je souhaite réaliser, un peut à la linux le hook est là pour (finalité) déplacer les fenetres vers les bureaux désirés.
Le CODE SOURCE est un code réalisé sous code block, mais ça c'est un detail, mais surtout utilise wxWidgets. Je précise juste que l'installation du hook intervient lorsque je clic droit sur le tray et que je fais aller sur le bureaux n°1, la flemme de me mettre une fenetre avec un bouton me demandant si je veut installer le hook
désinstallation du hook, clic droit sur le systeme tray -> quitter l'application.
Merci d'avance harko si tu peux m'apporter une aide
Marsh Posté le 20-07-2006 à 09:43:39
bon alors quelques soucis
- t'as installé wxWidgets à partir du devpack, ou alors from scratch ?
- tu linkes avec quelle librairie de wxWidgets ?
désolé hein, mais je connais pas du tout wxWidgets
Marsh Posté le 20-07-2006 à 13:30:47
je te up tout mon dossier de la librairie compilée à ma sauce, j'utilise uniquement les statics. Si tu utilises code blocks, les options de compilations sont configurée pour que le dossier wx263 se trouve dans c:\
wxWidgets est une librairie très simple tu vas très vite comprendre le mécanisme, surtout (il me semble) que tu connais MFC donc t'inquiete c'est 100 fois plus simple et mieux fichu.
Je rappel que je cherche à installer les hooks sans passer par des dll, j'ai troué quelques topic sur google qui expliquaient cela. Moi j'obtiens un magnifique plantage du systeme
Marsh Posté le 20-07-2006 à 13:55:58
bon ayé, ça marche (ou plutot non, ça marche pas, ça plante effectivement d'un fort beau gabarit, et j'emmene meme l'explorer avec moi )
par contre, tu dis que
Citation : |
ton but est bien de rajouter une entrée au menu système de n'importe quelle fenêtre pour la placer sur le bureau de ton choix ? si c'est le cas, alors tu devras obligatoirement passer par une dll étant donné que tu devras accéder à l'espace d'adressage de n'importe quelle application, ce que seule une dll permet. (un hook global passe obligatoirement par une dll)
je regarde ton code, mais n'espère pas faire autrement qu'en passant par une dll sauf si tu es amateur de violation d'accés mémoire en tout genre
Marsh Posté le 20-07-2006 à 14:04:24
c'est effectivement ça que je souhaite faire
en revenche si tu me dis qu'il faut passer par une dll, je ne vois pas comment faire pour donner des instruction à mon programme wxWidgets à partir de la dll puisqu'il faut compiler séparement
Marsh Posté le 20-07-2006 à 14:22:09
si si, ça je l'ai déja fait
regarde ce soft : http://harko.free.fr/soft/euroconv.zip, il utilise un hook global stocké dans une dll, et la fenêtre qui affiche la conversion est stockée dans la dll. c'est du MFC mais on s'en fout
je me souviens plus de ce que j'avais fait, je regarderais ce soir
Marsh Posté le 22-07-2006 à 00:34:35
tain j'ai essayé de créer la dll et tout mais le hook ne s'install pas, car à aucun moment je fais appel à DllMain où je pourrait récuperer le HINSTANCE
donc lors de l'appel de SetWindowsHookEx mon HINSTANCE vaut NULL ce qui fait que le hok ne s'install pas.
si tu as une idée, car là c'est plutot un domaine où je ne mets pas les pied habituellement. J'ai refait le tout dans un workspace histoire que ce soit plus clair.
Marsh Posté le 22-07-2006 à 00:35:33
jme mets dessus ce wk end, avec la chaleur je vais me calfeutrer
Marsh Posté le 22-07-2006 à 00:36:26
ReplyMarsh Posté le 23-07-2006 à 00:18:35
j'ai trouvééééé enfin presque
en fait pour qu'il rentre dans DllMain, il fallait que je le déclare comme ça:
Code :
|
donc là le hook s'install sans probleme. Il y a quant meme des p'tits soucis avec le hook, c'est que l'ors de la desinstallation du hook, mon nouveau menu reste encore avec le item menu "déplacer vers", et la le nouveaux menu ne se créé pa sur toutes les fenetres, il y a comme qui durait de l'alléatoire dans ça
Bref n'ayant plus l'esprit tres clair je vais aller dodo en esperant que demain je finisse pas trouver la solution.
Marsh Posté le 24-07-2006 à 08:58:06
alors bon, j'ai fait quelques tests et ben.... ça fait comme toi
le hook s'installe bien, mais ne se désinstalle pas du tout !
par contre, il se créé bien sur toutes les fenetres chez moi ! tu peux me poster ton projet actuel, j'ai quelques heures à tuer au taf aujourd'hui
Marsh Posté le 24-07-2006 à 11:22:51
j'ai up à nouveau le projet, en fait j'ai l'impression que le probleme de la desinstallation viendrai du fait qu'on ne restitut le menu le systemmenu qu'à la derniere fenetre mofiée (ie) clientHWND, mais ce qui est louche c'est que meme cette sur la derniere fenetre modifiée, je ne retrouve pas le menu reseté.
Code :
|
Deuxiemement, en fait mon nouveau popup menu se créé bien sur toute les fenetres, mais le probleme c'est que je dois clic deux fois droit sur la titlebar pour que mon nouveau menu apparaisse
Marsh Posté le 27-07-2006 à 08:42:02
bon apres des p'tites modifications j'ai quant meme 2 bugs dans le code:
1 - Il faut que je clic ou moins deux fois droit su la titlebar avant qu'apparaisse le MenuSysteme modifié par le Hook.
2 - Je n'arrive pas à restaurer le MenuSystem à l'originale
Code :
|
s'il y a des idées
Marsh Posté le 07-08-2006 à 14:49:15
merde, je croyais que c'était soldé ce topic
Marsh Posté le 07-08-2006 à 14:51:27
ben j'étais parti à Dublin une semaine donc j'ai pas touché au probleme, mais ils sont toujours là ie:
1 - Il faut que je clic ou moins deux fois droit su la titlebar avant qu'apparaisse le MenuSysteme modifié par le Hook.
2 - Je n'arrive pas à restaurer le MenuSystem à l'originale (GetSystemMenu avec true)
je vois vraiment pas d'où ça vient
Marsh Posté le 07-08-2006 à 17:37:44
question, lorsque je fais
menu = GetSystemMenu(cwp->hwnd,false);
est ce que je récupere un nouveau SystemMenu ou bien c'est a chaque fois la meme antité?
Marsh Posté le 08-08-2006 à 23:54:55
Bon j'ai un piti peu avancé, pour le reset du menu system ça merde car je ne sais pour quelle raison cwp->hwnd change 2 fois en gros à chaque clic droit sur une titlebar il rentre deux fois dans HookCreatePopUp et me donne 2 hwnd differents. Bref en faisant un p'ti test à l'arrache j'ai pu voir qu'en ayant le bon hwnd la fonction viremenu marche bien, et me restaure mon menu à l'origine. Par la suite ce sera un faux probleme car lorsque je vais quitter le programme je vais boucler sur toute les fenetres existantes et je vais faire un GetSystemMenu(hwnd,true) pour reseter tout les menus.
Par contre pour le premier probleme je ne vois vraiment pas comment le regler
Marsh Posté le 09-08-2006 à 13:47:48
Le premier probleme, il existe dans d'autres softs (un truc pour mettre les fenetres toujours devant que j'utilise). Par contre il me semble que le soft de gestion de bureau virtuels cité il y a eu dans blabla ( http://virt-dimension.sourceforge.net/ ) n'a pas le problème (ou alors j'ai pas fait gaffe...). Vu qu'il est open source, tu pourrais mater comment ils font
Marsh Posté le 11-08-2006 à 12:13:46
merci pour le lien
j'ai effectivement matter ce qu'ils font, mais c'est pas présenté de la meme maniere. j'ai testé le binaire et et ça marche du premier coup eux je vais encore chercher comment faire pour moi ça marche directement mais je commence à perdre espoire
Marsh Posté le 18-07-2006 à 21:03:44
Salut, voilà j'aimerais utiliser un hook sans dll dans mon programme en wxwidgets. Probleme c'est que je ne connais pas des masses le win32
Je me suis inspiré de ce qu'avait fais Harko une fois, et que j'ai gardé sous le coude (depuis un an )
Je souhaite intercepter le clic droit sur la barre de titre pour pouvoir rajouter des item au menu systeme. Voila le code, mais le probleme c'est que ça plante grave chez moi, un message d'erreur de memoire read, et puis plus d'explorer et plus rien...
Si vous avez des suggestions pour m'aider je suis preneur
EDIT: dans le callback HookOnClicMenu je peux utiliser un switch case mais j'avais la flemme, copié collé inside
Message édité par neg'gwada le 19-07-2006 à 21:07:37
---------------
--- WinSplit Revolution ---