Question de débutant sur hwnd

Résolu
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 - 27 août 2004 à 08:39
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 - 27 août 2004 à 14:42
salut a tous. bon une question toute bete.
je voudrais a chacune de mes actions savoir si ma fenetre est ouverte, férmée, rétrécie,etc. alors la question que je me pose : est ce que je dois créer un hwnd global que j'initialise a chaque ouverture de ma fenetre et ke a chaque fermeture (je dois dc controler tous les cas, ok, annuler, la croix...) j'invalide mon hwnd global, ou un findwindow a chaque fois que j'ai besoin serait la solution? dans ce cas je fait comment, sachant que la fenetre en question est une dialogbox? paske findwindow ca marche comment? jai cherché msdn et jai regardé les sources ou c'est utilisé, jai pas trop capté comment je fait pour l'utiliser. merci d'avance

18 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 13:18
Oui ca devrait marcher, en faisant un truc du genre :

ShowWindow(hDlg, WM_SHOWNORMAL);

ca devrait rendre ta fenetre visible si elle est dans le systray.
A tester ...

Shell
3
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 août 2004 à 11:07
Ben tu utilises un hwnd global ke tu initialises ds ton WM_INITDIALOG et pis apres tu joues avec ! Pas de findwindow puis ce que tu as le hwnd, pkoi le chercher ?

++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 11:38
Une fois que tu as défini ton handle en globale il n'est pas nécéssaire de le rechercher a chaque fois que tu voudras t'en servir. c'est bien le but des varaibles globales.

Tu vas donc déclarer le handle en global et tu va l'initialiser dans ton WM_INITDIALOG:
#include <....>
...
HWND hDlg;
...

BOOL CALLBACL AppDlg(.......)
{
    case WM_INITDIALOG:
            hDlg = hWnd;
            break;
     ....
}

APIENTRY WinMain(.....)
{
    ...
}


Ensuite pour trouver dans quel etat est ta fenetre, sert toi de la fonction GetWindowPlacement(). Si je me trompe pas elle renvoie un flag en fonction de l'etat de la fenetre : WM_MAXIMIZE pour agrandie, WM_MINIMIZE pour retrécie, WM_SHOWNORMAL pour etat normal,....

Shell
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 août 2004 à 11:44
Je savais pas pour GetWindowPlacement(), jviens de verifier, c tt a fait exact ce ke tu dis DeathCrash. Sinon il existe des fonctions IsQuelqueChose : IsIconic, IsZoomed, IsWindow...Etc.
Mais c koi le mieux ?
0

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

Posez votre question
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 août 2004 à 12:17
non ma question est uniquement "qu'est ce qui sera la mieux?" paske pr moi, le findwindow sera plus lourd, mais la variable globale est plus chiante a manier et moins sure. et si j'utilise le findwindow, ca marche comment? je fais comment pour utiliser findwindow sachant que je cherche ma dialogbox? je sais bien que je vais pas utiliser les 2, ca serait debile (chui newbie en api, mais le C++ ca va, je manie correctement on dira)
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 août 2004 à 12:19
et le probleme si j'initialise mon hwnd dans la initdialog, est ce que quand ma fenetre se ferme mon handle sera invalidé corectement ou est ce qu'il faut ke je le fasse a la main des ke je fais une action suceptible de fermer ma fenetre? genre est ce que je dois faire
case ID_CANCEL:
monhwnd = 0;
//traitement;
break;

???????
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 12:34
AlexMan> Le mieux c'est d'utiliser GetWindowPlacement() car elle te renvoie l'etat actuel de ta fenetre.
Si tu utilises IsIconic, tu vas recuperer un booléen qui te dira simplement si ta fenetre est minimisé ou pas mais ne te donnera pas son état et tu devras donc faire des tests avec d'autre fonction comme IsZoomed(),....
GetWindowPlacement te renvoie le résultat direct.

leprov> Apparemment t'a pas compris grand chose a l'avantage des variables globales. Je vois pas ou est la difficulté a utiliser une varaible qui en plus est globale!
Au cas ou tu ne l'aurais pas compris, le handle d'une fenetre est crée a son lancement et ne change pas durant toute l'execution de celle ci, quelque soit sont etat d'affichage!

T'es question ne sont pas non plus très clair. Ca reflete surement le fait que tu n'ais pas compris certaines bases du C et l'utilisation des fenetres et dialog!

Qu'est ce que tu appelles "invalidé le HWND" ???
A quoi ca sert de rechercher sa propre fenetre avec FindWindow() alors que le handle tu l'as deja ???

T'es sure d'avoir tout bien compris concernant la programmation en C/C++ ???

Shell
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 août 2004 à 12:39
ok DeathCrash, merci et leprov ecoute ce kil te dit, c skil faut faire.

++
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 août 2004 à 12:56
bon ma kestion est pas claire.... si on est bien d'accord un hwnd est un pointeur. un pointeur est valide ou invalide. ce que je dis c'est que j'ai stocké mon hwnd ds une variable globale, j'ai donc un pointeur sur ma fenetre. mintenant je ferme ma fenetre, et j'utilise mon hwnd. et la ca fait koi, ca va me provoquer une erreur paske mon hwnd pointe sur une fenetre qui n'existe plus, ou ca va me sortir que mon pointeur est invalide et mon prog va continuer a s'executer correctement? si je fais un showwindow sur ce hwnd, ou un getwindowplacement, est ce que ces fonctions vont me sortir une erreur, ou fonctionner en me disant que l'etat de cette fenetre est qu'elle n'existe pas? mon probleme dans l'utilisation de la variable globale est la, est ce que une fois ma fenetre fermée cette variable est toujours utilisable, ou est ce qu'il faut que dans mon analyse des messages envoyés a ma fenetre il faut a chaque fois ke j'invalide mon hwnd pour dire que j'ai fermé ma fenetre?
j'espere que ma kestion est plus claire
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 août 2004 à 12:57
quand a ta question sur les bases du C/C++ tinkiete pas pr ca. le probleme concerne la prog systeme et les apis que je maitrise pas tres bien
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 août 2004 à 12:59
mais tu veux utiliser ce handle a partir de la fenetre mm ou d'une autre application ? Si c la mm fenetre, aucune raison de perdre le hwnd, variable globale, c'est la solution.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 août 2004 à 13:01
mon prog est ds la systray et ouvre ma dialogbox dont je veux pvr connaitre l'etat a tout moment a partir de la systray, dc a partir du meme programme, mais a partir d'une autre fonction
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 août 2004 à 13:02
pardon je me rend compte que "état" est pas vraiment le bon terme, je veux surtt savoir si elle existe ou pas
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 août 2004 à 13:03
Ben on se fout ke ce soit une autre fonction puis ce ke ton hwnd sera GLOBALE. Je pense que tu vas chercher des pb la ou il n'y en a pas, c tres simple, si tu suis ce ke DeathCrash ou mm moi t'avons dit, ca ira tres bien.

++
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 août 2004 à 13:07
bon....mon hwnd est global, ok. ce que je veux savoir :

fonction de ma dialogbox:
case initdialog :
hdlg = hwnd;
//le reste de la fonction

fonction de ma systray:
showwindow (hwnd, etc...)

est ce que la ca va marcher (en y mettant la syntaxe bien sur)
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 13:11
leprov> Ta la tete dur ma parole. Les API sont très bien fait. En cas d'echec elle te renveront la plupart du temps une valeur d'echec. Pour cela faut voir dans la MSDN.
Si j'ai tout bien compris, tu as un programme principale qui ouvre une dialogbox.
Maintenant dans ton programme principale tu vas conserver le handle de ta dialogbox. Ainsi tu pourras connaitre l'etat de ta fenetre a tout instant. Si la fonction GetWindowPlacement te renvoie une erreur c'est alors que tu seras que ta dialogbox a été fermé par l'utilisateur et que son handle est ainsi plus valide.

Comme AlexMan te la dis pourquoi est ce que tu cherches des problemes la ou il y en a pas ?!

Shell
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 août 2004 à 13:15
dsl...
je cherche pas des pbs, je cherche a comprendre ce que je fais et comment fonctionnent les choses, simplement. pour vous c'est evident, moi je debute, je prefere chercher a comprendre les choses en profondeur plutot que de les faire a l'instinct et un jour me rendre compte que les choses fonctionnent pas comme je croyais.....
en ts les cas merci d'avoir pris le tps de repondre
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 août 2004 à 14:42
merci de m'avoir repondu.
j'ai juste fait des if(IsWindow (MonHwndGlobal)) ShowWindow (MonHwndGlobal, WS_RESTORE);
et comme ca ca marche. merci d'avoir pris le tps de m'expliquer comment ca fontionnait (et faut avouer kjai eu du mal, vous avez été patient :D)
0
Rejoignez-nous