Cacher une fenetre avant son ouverture

Signaler
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
-
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
-
Bonjour,

J'aurai une petite question, je cherche a cacher une fenêtre avant son ouverture. A la base je suis en c# et je me suis dit que la meilleure façon de faire ca était un hook sur le shell....

Bref me voici dans mes vieux souvenir de c++.
Bref je suis dans le hook de creation de fenetre et je scan les noms de class quand il choppe "IEframe" il le hide donc le principe exemple:

GetClassNameA(hwnd,classtest,50);
if (strcmp(classtest,"IEFrame")!=0) break;
g_OldEdit =(WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG)fSetStyle);

dans mon fSetStyle rediriger J'ai dans un premier temps essayer de overrider le style de la cration de fenetre avec un
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_VISIBLE);
sans succes
ou je rentrerai pas dans les details mais un copy memory base un peu sur l idee de ce site http://www.thescarms.com/vbasic/OwnerDrawn.aspx

Je suis a cours d idee car j"arrive a faire ce que je veux faire c"est a dire empecher de montrer une fenetre avant sa creation juste showwindow(hwnd, SW_hide) aurait ete si simple.

@+
youpi :)

6 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Une petite remarque concernant ton premier bout de code. Le flag GWL_WNDPROC dans SetWindowLong() permet de changer la procédure de la fenêtre et non son style. Il s'agit sûrement d'une erreur de copier/coller.
Pour que la modification de certains styles soit effective, il faudra ensuite appeler SetWindowPos() avec le flag SWP_FRAMECHANGED en dernier paramètre. A tester donc.
Il parait qu'il s'agit d'une fenêtre appartenant à un autre process. Tu peux t'inspirer de mon dernier code source dans lequel on sous-classe une telle fenêtre par injection de DLL. Dans la procédure de sous-classement, on peut intercepter WM_SHOWWINDOW, WM_WINDOWPOSCHANGING ou WM_WINDOWPOSCHANGED etc. Il est également possible d'utiliser SetWindowPlacement() au lieu de ShowWindow(). Une autre manière de "cacher" une fenêtre est de lui donner des dimensions nulles grâce à SetWindowPos(). Tout dépend de ce que tu veux faire exactement. Ce ne sont là que des idées. J'espère qu'elle te seront utiles.
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
Salut racpp,

effectivement, je penses que tu n'es pas loin de la solution.
je suis arriver a cacher la fenetre avant sont apparition avec
case WM_WINDOWPOSCHANGING:
((WINDOWPOS *)lParam)->flags &= ~SWP_SHOWWINDOW;else((WINDOWPOS *)lParam)->flags &= SWP_SHOWWINDOW;
break;

en revanche, si j'ai envie de la rendre visible j'ai pas encore reussi. Concernant le SWP_FRAMECHANGED je n'étais pas au courant il va falloir que je test. et concernant le GWL_WNDPROC oui je sous class bien mon windows procédure le nom de fstyle est peut être mal choisit
voici la def:
LRESULT CALLBACK fSetStyle(HWND hwnd,UINT Msg,WPARAM wParam, LPARAM lParam)

sinon les dimensions null avec setwindowpos ne marche pas, en revanche je pourrais faire un setwindowpos avec des coordonnées négatives mais je préfère ne pas utiliser cette méthode pour le moment.
il faut que je teste SetWindowPlacement

le top serait que cela marche
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_VISIBLE);
SetWindowPos() avec le flag SWP_FRAMECHANGED qui marche

en tout cas merci, je suis toujours ouvert a d'autre suggestion.
@+
youpi :)
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
pour le
case WM_WINDOWPOSCHANGING:
((WINDOWPOS *)lParam)->flags &= ~SWP_SHOWWINDOW;else((WINDOWPOS *)lParam)->flags &= SWP_SHOWWINDOW;
break;

enleve le else


@+
youpi :)
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Pour changer le style d'une fenêtre on n'a pas besoin de la sous-classer. Tu peux assigner à la fenêtre une propriété avec SetProp(). Cette propriété sera utilisée comme flag permettant de cacher ou montrer la fenêtre selon sa valeur 0 ou 1 par exemple. Dans le traitement de WM_WINDOWPOSCHANGING utilise GetProp() pour récupérer cette valeur. SetWindowPos() provoque l'envoi du message WM_WINDOWPOSCHANGING.
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
J'essaye de voir avec ton GetProp, je suis entrain de voir dans le msdn mais je suis pas sur de comment tu veux faire par contre...
imaginons j'ai le handle de ma windows (hwnd) qui entrain de se creer (WM_create)
qu'est ce qu'il doit recuperer comme lpString [in] du getprop j'ai du mal a comprendre, pourrais-tu eclaircir par un exemple.

@+
youpi :)
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
ecoute j'y arrive avec ton setprop et ton getprop
merci

@+
youpi :)