Comment intercepter un message Win32 sans Hook ?

cs_Kikouman Messages postés 4 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 17 février 2004 - 11 févr. 2004 à 10:40
cs_Kikouman Messages postés 4 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 17 février 2004 - 17 févr. 2004 à 11:01
Hello à tous,

J'ai un problème (comme tous ceux qui chat icic ;) ) Je crée en ce moment une petite application (C/Win32/DirectX) qui utilise tout le bureau sauf la barre des tâches de Windows. Un truc que je fais sans prb avec la fonction "FindWindowEx" pour récupére un RECT qui me donne la taille du bureau de Windows. Seulement voilà, si quelqu'un s'amuse à déplacer la barre des tâches, ma fenêtre ne s'ajuste pas. Par exemple si à l'initialisation de mon porg la barre des tâches est en bas, si un gars la déplace ensuite à gauche, mon application laisse une bande en bas du bureau de la taille de la barre des tâches ...

J'ai essuite essayé de faire du sub-classing du bureau de Windows, mais j'ai un pote qui me dit que de sub-classer Explorer.exe et surtout l'une de ses procédures c'était un peu chaud surtout concernant la sécurité et la stabilité de mon prog et de Explorer. J'ai cherché à récupérer les infos dans le registre mais rien. Donc ma dernière, idée serait de récupérer tous les messages Windows (je ne sais pas comment faire) pour récupérer un truc du genre WM_SIZE...

Bref si quelqu'un a une idée pour que je puisse avoir un jour la possibilité d'afficher une fenêtre Windows qui adapte sa taille automatiquement en plein écran moins la taille de la barre des tâches même quand on déplace la barre des tâches, je suis prenneur !

- Kikouman -

6 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
11 févr. 2004 à 12:18
pour intercepter les messages du bureau tu doit passer par les hook.

ou bien tu peut essayer de mettre un timer qui vérifie régulièrement la position de la barre des tâches.
0
cs_Kikouman Messages postés 4 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 17 février 2004
11 févr. 2004 à 12:39
on problème est aussi lié à la performance ... Car il est indiqué un peu partout dans les MSDN que si tu fais un hook il faut en sortir le plus vite possible, en gros ne jamais laisser un hook permanent. De l'autre côté, l'option du timer j'y est pensé mais faire un test toute les secondes par exemple ne va-t-il pas ralentir mon application ou Windows d'autant que je vais cumuler avec DirectX qui n'aime pas trop être interrompu ...

Mais merci de ton intervention.

J'ai chercher encore un peu et comme j'ai facilement le handle du SysListView32 (la fenêtre avec les icones de Windows) je vais tester un truc du genre ListView_GetVewRect avec la fonction SendMessage () passé dans ma procédure windows... Enfin je vais voir.

Si quelqu'un a une idée plus sioux je prend :D
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
12 févr. 2004 à 10:36
Pour récupérer le RECT de la partie "non-barre de taches" il y a une API :
SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0)

C'est un peu mieux que ce que tu fais parcequ'il peut y avoir plusieurs barres de tâches (la barre Office par exemple).

Pour le hook je pense aussi que c'est trop lourd pour si peu. Le timer toutes les secondes me parait très suffisant, et ce n'est pas gourmand en CPU!

Si vraiment tu veux un truc nickel je crois que tu peux utiliser GetWindowThreadProcessId et AttachThreadInput pour récupérer les messages d'une fenêtre. Mais ça je ne le maitrise pas trop...

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
cs_Kikouman Messages postés 4 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 17 février 2004
12 févr. 2004 à 11:34
Merci beaucoup pour ces informations Mr Pennac,

Je vais essayer la fonction SystemParametersInfo() pour voir ce que ça change. Mais sans vouloir te contrarier avec mon astuce de faire FindWindow successivement de :

Progman -> SHELLDLL_DefView -> SysListView21

je pense qu'il est difficile que mon RECT ne retourne pas la bonne fenêtre. Mais bon tas technique marche surement très bien et je vais l'essayer de ce pas.

Merci aussi pour la piste GetWindowThreadProcessId (). J'ai matté les MSDN, et apparament ca revient à matter les messages dans les thread d'une autre application. Ce qui semple impliquer que mon application soit multithreadée ... et autant te dire que j'en ai fait et que je n'ai pas super envie de m'y remettre ;)

Mais bon je garde ça sous le coude.

Merci aussi pour ton avis sur le timer, et je sens que c'est ce que je vais finir par faire avec un timer à 1 sec par exemple.

- Kikouman -
0

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

Posez votre question
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
12 févr. 2004 à 12:07
Ce n'est pas la peine d'avoir une appli multi-thread (ce qui d'ailleurs n'est pas compliqué du tout à mettre en oeuvre). Le thread principal suffit!

Et d'ailleurs quand tu fais un timer en fait c'est un thread!

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
cs_Kikouman Messages postés 4 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 17 février 2004
17 févr. 2004 à 11:01
Salut garslouche,

J'ai bien testé ta fonction :

SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0)

Mais ça na pas fonctionné comme je le voulai... Dans le RECT je récupère juste la définition de Windows (de tout le bureau) et c'est tout, même si la barre des tâches est apparente et même si j'ai une barre Windows sur le bord de mon écran. Ma façon de faire semble plus efficace :

HWND hDesktop;
RECT rDesktop;

hDesktop = FindWindow ("Progman", NULL);

if (hDesktop != NULL) {
hDesktop = FindWindowEx (hDesktop, NULL, "SHELLDLL_DefView", NULL);
}

if (hDesktop != NULL) {
hDesktop = FindWindowEx (hDesktop, NULL, "SysListView32", NULL);
}

if (hDesktop != NULL) {GetWindowRect (hDesktop, &rDesktop);

C'est plus long ;) mais ça marche (partout je n'en suis pas encore certain)

- Kikouman -
0
Rejoignez-nous