youpiyoyo
Messages postés539Date d'inscriptionvendredi 6 juin 2003StatutMembreDernière intervention14 juillet 2010
-
2 juil. 2010 à 19:21
youpiyoyo
Messages postés539Date d'inscriptionvendredi 6 juin 2003StatutMembreDernière intervention14 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.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és539Date d'inscriptionvendredi 6 juin 2003StatutMembreDernière intervention14 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 :)
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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 ?
youpiyoyo
Messages postés539Date d'inscriptionvendredi 6 juin 2003StatutMembreDernière intervention14 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.