1

Bonjour,

Je cherche un moyen de détecter quelles fenêtres sont des tooltip en fonction de leur HWND.
Des idées?

2

Je précise un peu le problème :
Sous windows vista, il y a un module qui propose de donner le focus à telle ou telle fenêtre quand on la survole avec la souris.
Je veux faire à peu près la même chose.
Mon code marche bien, sauf dans le cas où on ouvre deux fenêtres du même logiciel. Dans ce cas, si les onglets sont rassemblés dans la barre des taches et qu'on clique sur l'onglet qui représente les 2 fenêtres, ça marche encore. Mais quand on reste sur un des 2 onglets et que la tooltip apparait, la sélection des onglets se ferme...

En fait, mon code à trouvé une fenêtre qui ne soit ni le bureau, ni la barre des tâches, et sur laquelle la souris se trouve... Et c'est la tooltip qui ouvre cette fenêtre, mais je suis pas sur que ce soit la fenêtre de la tooltip

3

Je n'ai jamais testé, mais normalement les fenêtres tooltip appartiennent à la classe TOOLTIPS_CLASS, ce que tu peux détecter en utilisant GetClassName().

Attention, certains programmes gèrent les contrôles eux-mêmes au lieu d'utiliser ceux du système, même si l'apparence graphique peut être semblable. Ça ne marchera donc pas dans ce cas-là. Je ne vois pas trop de solution à part utiliser un espion à messages (comme WinSpy++ ou autre) pour trouver les noms de classe qu'ils utilisent, et ça reste du cas par cas.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

4

J'ai trouvé un hack. Le problème c'est que c'est la tooltip qui prend le focus (sans que je fasse rien elle ouvre 2 fenêtres prioritaires sur la barre des taches), et que la barre des taches ne supporte pas que je lui rende le focus.
Du coup, j'essaie de détecter la hauteur des fenêtres...

TOOLTIPS_CLASS -> super idée!
Mais je n'arrive pas à convertir le LPTSTR (whar_t*) en chaine classique afin de la traiter, j'y ai passé 2 heures hier -_-
En fait, la macro T2A ne marche pas puisque mon programme n'utilise pas ATL, et je peux pas inclure ATL parce que ça me donne des erreurs de compilation.
Il y a une façon particulière d'inclure ATL?

5

multibytetowidechar et widechartomultibyte; mbtowcs et wcstomb, aux majuscules près?

6

Qu'est-ce que tu entends par "chaîne classique" ? (parce qu'un LPTSTR, c'est pareil qu'un LPSTR si tu es en mode non-Unicode, et c'est un type "classique" en C/C++)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

7

wcstomb plante, je n'arrive à voir la chaine qu'avec le débugguer.
Une chaine classique : char*, string, cstring, qstring...
Je crois que je suis en unicode vu que c'est du wchar en interne

8

Si tu utilises GetClassNameA() (le A est important, ça veut dire que c'est la version ANSI), le résultat sera un LPSTR, qui est équivalent à char * (pas wchar *).
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

9

ah oui c'est le mieux ^^

sinon http://msdn.microsoft.com/en-us/library/aa450989.aspx

attention aux paramètres.

comment tu utilises wcstomb? faut allouer un buffer avant de le passer à la fonction.

10

Ouaip, je suis passé par les chaines Ansi, ça marche beaucoup mieux!
Mon programme marche, mais c'est difficile de faire quelque chose d'universel : par exemple, sous Windows, quand on clique sur un menu, c'est considéré comme une fenêtre. Si on active cette fenêtre elle se ferme, donc vaut mieux pouvoir les détecter. Or les classes diffèrent suivant les framework. Par exemple, sous Qt, c'est un QPopup qui s'ouvre, mais je suis sur qu'on peut afficher autre chose qu'un menu avec un QPopup.
Donc peut être qu'il faut détecter des propriétés particulières sur l'objet.

Mais pour le moment je suis satisfait du résultat, alors je ne vais pas plus en profondeur

Merci pour l'aide :-)

11

En théorie, pour la comparaison, il faudrait plutôt ceci:
TCHAR buf[ ... ];
GetClassName( ... )
if( _tcscmp( buf, TEXT(TOOLTIPS_CLASS)) == 0 )
{
    ...
}
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.