Cacher une fenetre avant son ouverture

youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 2 juil. 2010 à 19:21
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 14 juil. 2010 à 15:57
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

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
4 juil. 2010 à 15:16
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.
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
6 juil. 2010 à 17:17
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 :)
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
6 juil. 2010 à 17:18
pour le
case WM_WINDOWPOSCHANGING:
((WINDOWPOS *)lParam)->flags &= ~SWP_SHOWWINDOW;else((WINDOWPOS *)lParam)->flags &= SWP_SHOWWINDOW;
break;

enleve le else


@+
youpi :)
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
6 juil. 2010 à 18:07
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.

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

Posez votre question
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
13 juil. 2010 à 21:45
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 :)
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
14 juil. 2010 à 15:57
ecoute j'y arrive avec ton setprop et ton getprop
merci

@+
youpi :)
Rejoignez-nous