[win32] forcer une fenetre a rester en premier plan

Signaler
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
bonjour a tous,

voila mon probleme, je developpe une application qui protege l'ordinateur sur lequel elle tourne, pendant l'absence de l'utilisateur, en demandant un mot de passe.
donc g fait une fenetre plein écran avec une petite boite de dialogue pour le passe et ca marche impecable..

le probleme c que alt-tab reduit a neant tous mes efforts.
pourtant en cherchant g trouvé un truc qui aurait pu mettre fin a mon cauchemar :
SystemParametersInfo(
UINT uiAction, // system parameter to query or set
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // user profile update flag
);

avec SPI_SETFASTTASKSWITCH comme action.

mais MSDN dit que c obsolete et que le "FASTTASKSWITCH" est tout le temps operationnel maintenant

est ce que vous connaissez un moyen de contourner mon probleme, si oui, je vous en serais tre reconnaissant ;-)

merci d'avance pour vos lumieres !

ps: g deja teste dans WM_KILLFOCUS :
SetForegroundWindow()
SetActiveWindow()
SetWindowPos()
SetWindowPlacement()

le meilleur resultat c SetWindowPos car elle remet bien ma fenetre en premier plan, mais la barre de taches ne se cache pas donc ca sert a rien... :sad)

@+
tcok

26 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
fonction de HOOK dans une dll.
BruNews, ciao...
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
1
Tu peux aussi killer explorer.exe au lancement de ton application et le relancer à la fermature.

Ca supprime le desktop windows, le menu démarrer ainsi que alt+tab
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

je connais rien aux hook, je les ai jamais utilisés. est ce que tu pourrais etre plus précis. je fais un hook sur ma fenetre avec une fonction dans une dll. pk faut il qu'elle soit dans une dll ?
merci

@+
tcok
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

est ce que cette solution supprime aussi le ctrl+alt+suppr et le alt+f4 ? parce que g besoin de tous virer pour la protection soit sans failles :)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Dans une dll parce qu'elle devra etre mappee sur tout processus tentant de demarrer, donc niveau systeme.
Regarde SetWindowsHookEx() dans MSDN, j'ai deja fait exemples.
BruNews, ciao...
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

bon je recapitule, tu me dis si je me trompe :

je fais SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)lpfn,hinst_dll,0 );

et dans la dll je bloque tous ce qui vient de WM_SIZE dans ma fenetre et ca va l'empecher de se faire "resizer".

@+
tcok
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
A toi de voir ce qui te convient dans la dll mais ATTENTION, enregistre bien ton travail avant les essais !!!
On peut faire des trucs fantastiques (au sens propre) avec un hook systeme.
BruNews, ciao...
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

y'a un truc que je capte pas du tout. comment je fais pour savoir si c bien vers ma fenetre que le message est envoyé vu que je n'ais plus mon HWND dns la dll ? faut que je fasse
un FindWindow a chaque fois q'on rentre dans la fonction hook ?

@+
tcok
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

je capte pas du tout les hook, g fait
if( lpmsg->message WM_SIZE && lpmsg->hwnd GetForegroundWindow() )
return 0;

dans la HOOKPROC et ca bloque rien du tout.

tu pourrais pas me donner un tit exemple ou me mettre un peu plus sur la voie sil te plait?

@+
tcok
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

je capte pas du tout les hook, g fait
if( lpmsg->message WM_SIZE && lpmsg->hwnd GetForegroundWindow() )
return 0;

dans la HOOKPROC et ca bloque rien du tout.

tu pourrais pas me donner un tit exemple ou me mettre un peu plus sur la voie sil te plait?

@+
tcok
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

je capte pas du tout les hook, g fait
if( lpmsg->message WM_SIZE && lpmsg->hwnd GetForegroundWindow() )
return 0;

dans la HOOKPROC et ca bloque rien du tout.

tu pourrais pas me donner un tit exemple ou me mettre un peu plus sur la voie sil te plait?

@+
tcok
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
mets une variabe:
HWND myhwnd = 0;
tu exportes une func depuis la dll pour initialiser myhwnd avant lancement du hook.
A ce point tu devrais rencontrer un probleme de reconnaissance de ta hwnd.
Je te laisse trouver seul pour l'instant. On reprendra si tu arrives jusque la.
BruNews, ciao...
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

desole pour tous les messages en doubles, c ma connexion 56k qui a buguée...

lorsque je fais HWND myhwnd = 0;
et une fonction pour l'initialiser, ca ne marche pas non plus.
G l'impression que le myhwnd reste tjs egal a 0...
je comprends plus rien la !
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
voila ou il fallait arriver, c'est bien.
Trouve un debut d'explication, on y remedie ensuite.
BruNews, ciao...
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

je crois que le systeme utilise une autre instance de la dll ce qui fais que hwnd est tjs a 0 .
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
alors, comment faire ?
place le mywnd en segment partage entre toutes les instances. Je te laisse un peu fouiller, je crois que Kaid avait mis un exemple de cela. Si tu ne trouves pas je te donne.
BruNews, ciao...
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

ca va te paraitre bizarre mais en fait ca marche sans segment partage

voici ma fonction de hook :

LRESULT CALLBACK SecureWindow(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT *lpmsg;
lpmsg = (CWPSTRUCT*) lParam;
if(nCode < 0) return (CallNextHookEx(NULL, nCode, wParam, lParam));
if( lpmsg->message WM_KILLFOCUS && lpmsg->hwnd myhwnd )
{
char test[250];
wsprintf(test, "window : %d", myhwnd );
MessageBox(NULL, test, "test", MB_OK);
return 0;
}

return (CallNextHookEx(NULL, nCode, wParam, lParam));
}


et ca m'affiche bien le HWND ! c franchement bizarre les hooks !
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
mais ta dll est en hook systeme ?
Tu as teste en perdant le focus depuis une autre appli ?
Que fera-t-elle a ce point ?
BruNews, ciao...
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
A oui au fait, pour sur qu'elle ne connait que ta hwnd, dans les autres processus il est a ZERO, donc le test sera toujours bon.
BruNews, ciao...
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

oui peut etre, mais si le progrzmme est rentre dans le if
c bien que mywnd a ete initialise donc je peux traiter le hook sur ma fenetre non? a moins que je n'ais pas encore bien saisi le fonctionnent ...