Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Activer et mettre une application au premier plan, à partir d'un autre appli cation.

7 réponses
Avatar
David MAREC
Salut zatous& zatoutes.

Je vous fais part d'un petit problème que je cherches à résoudre.

J'ai écris un "lanceur" [1], qui créé et lance une nouvelle application
(CreateProcess) et le surveille pour se terminer si cette dernière a été
fermée.

Ce lanceur sert surtout à inhiber les instances multiples d'exécution.
Donc, dans une première version, il invoque l'instance du lanceur
précédent afin que cette dernière ferrme l'application lancée et se
termine, avant de re-lancer l'application.

Mais,je désire maintenant invoquer l'instance du lanceur précédent afin
que cette dernière affiche et active au premier plan l'application
qu'elle a démarré.

Je récupère donc le handle de la fenêtre lancée par
EnumWindows() puis GetWindowThreadProcessId();

Je tente de la mettre active et en premier plan et là, j'ai différents
comportements:
- J'utilise ShowWindow, SetWindowPos et PostMessage. -

1- (Notepad), l'application se restore et apparaît en premier plan, mais
reste désactivée. (j'ai déjà eu ce problème, mais je ne me souviens plus
de la solution).

2- (L'application X) , l'application refuse même de se restaurer.

3- en cas de splash-screen, plantage de X.

Que faire pour contrôler efficacement ces fenêtres?

Essais infructueux en vrac, dans le callback Appelé par EnumWindows():

SetWindowPos(hwnd, HWND_TOP,0,0,0,0,SWP_SHOWWINDOW);
ShowWindow(hwnd, SW_RESTORE);
PostMessage(hwnd, WM_ACTIVATE, 0, NULL);
SetActiveWindow(hwnd);



[1] si j'ai réinventé la roue, merci de me le signaler.

7 réponses

Avatar
patrox
SetForegroundWindow a l'air de marcher.

pat.
Avatar
Christian ASTOR
David MAREC a écrit:

Je tente de la mettre active et en premier plan



SwitchToThisWindow() ou
SetForegroundWindow() avec les remarques de la KB (AttachThreadInput(),
SPI_SETFOREGROUNDLOCKTIMEOUT, ...)
Avatar
David MAREC
Bonjour,

D'après Christian ASTOR:

Je tente de la mettre active et en premier plan




SwitchToThisWindow() ou



Fonction introuvable, sous le compilateur, comme dans l'aide.
Pourtant , dans la msdn sur le oueb, elle est décrite comme étant partie
de winuser.h, et la bibliothèque user32.

SetForegroundWindow()



Rigolo, lorsque j'ai commence à écrire la première parenthèse, apparait
ce message sous VC++6 :
"Veuillez insérer un disque dans le lecteur E:/" (Mon lecteur CD)
ensuite, il plante.

Sinon, après avoir écrit le code à l'aide du notepad,
- Ca c'est de l'IDE qui clignote, VC++ -
j'obtiens les mêmes symptômes que précédemment.
Que l'application soit en premier plan et pas active ne me gène pas
trop, par contre, rien ne fonctionne avec l'application pour laquelle
j'ai écris le "lanceur".
Si j'en réduis la fenêtre, je n'ai pas trouvé de moyen pour la rétablir.
hormis de cliquer sur la barre de tache, bien entendu).

avec les remarques de la KB (AttachThreadInput(),
SPI_SETFOREGROUNDLOCKTIMEOUT, ...)



Vous pouvez préciser ? Il me semble que la dernière option doit être
précisée dans les applications clientes de mon lanceur. Ce que je ne
peux maitriser.

Dans le cas de AttachThreadInput, d'une part j'ai du mal à comprendre
comment l'employer, et surtout comment pourrait-il résoudre mes soucis ?
Avatar
Manu et Isa
> > SwitchToThisWindow() ou

Fonction introuvable, sous le compilateur, comme dans l'aide.
Pourtant , dans la msdn sur le oueb, elle est décrite comme étant partie
de winuser.h, et la bibliothèque user32.





"Although you can access this function by using LoadLibrary and
GetProcAddress combined in Microsoft Windows versions prior to Windows XP,
the function is not accessible using the standard Include file and library
linkage. The header files included in Windows XPService Pack 1 (SP1) and
Windows Server 2003 document this function and make it accessible using the
appropriate Include file and library linkage. However, this function is
deprecated and not intended for general use. It is recommended that you do
not use it in new programs because it might be altered or unavailable in
subsequent versions of Windows. "

Manu
Avatar
Manu et Isa
> A part ça, le plus étrange reste Visual C++ qui plante lorsque le
curseur ou le pointeur a le malheur de survoler "SetForeGroundWindow("
Ca rend les essais assez difficiles.



Je travail sous le meme environnement (XP VC++ 6.0) et je n'ai jamais eu de
probleme avec cette fonction (je n'ai pas appliqué les correctifs
toutefois...)

Manu
Avatar
David MAREC
Bonjour,

D'après Manu et Isa :
SwitchToThisWindow() ou







>[Snip extrait MSDN]

Exact, j'ai donc effectué quelques essais dont je me permet
de diffuser le rapport icitte, puisque ça doit intéresser du monde.
- Non ? Tant pis. -

Exécution du Notepad en client, XP SP1, dont la fenêtre est représentée
par _hwnd_ et le processus dans _wndpid_ par
GetWindowThreadProcessId(hwnd, &wndPid);

Tout ceci s'exécute dans le CALLBACK d'un EnumWindows().

(utilisation de
/*/
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &dwTimeout, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0);
/*/
Même si ça me semble assez inutile, vu du 'lanceur'.
)


/*/*/
HMODULE hLib = GetModuleHandle("user32.dll");
void (__stdcall *SwitchToThisWindow)(HWND, BOOL);
(FARPROC &)SwitchToThisWindow = GetProcAddress(hLib,
"SwitchToThisWindow");
SwitchToThisWindow(hwnd, TRUE);
/*/*/

Bizarrement, Cela ne fonctionne que si la fenêtre du notepad a été
réduite, sinon, clignotement dans la barre de tâches.

/*/*/
HWND hCurrWnd = GetForegroundWindow();
DWORD iCurrTID;
GetWindowThreadProcessId(hCurrWnd,&iCurrTID);
AttachThreadInput(wndPid, iCurrTID, TRUE);
SetForegroundWindow(hwnd);
AttachThreadInput(wndPid, iCurrTID, FALSE);
/*/*/

Là, clignotement dans la barre de tâche dans tous les cas, sauf si je
commande un ShowWindow(hwnd,SW_RESTORE).


A part ça, le plus étrange reste Visual C++ qui plante lorsque le
curseur ou le pointeur a le malheur de survoler "SetForeGroundWindow("
Ca rend les essais assez difficiles.
Avatar
David MAREC
Selon Manu et Isa,

[SetForegroundWindow() et VC++]
Je travail sous le meme environnement (XP VC++ 6.0) et je n'ai jamais eu de
probleme avec cette fonction (je n'ai pas appliqué les correctifs
toutefois...)



Je ne sais plus trop où en sont les correctifs.
Mais c'est non seulement étrange, mais agaçant.
Un IDE qui plante parce que la souris survole une fonction, ça ne fait pas très
sérieux.

Ceci dit, le problème initial reste entier.

--
signature de coin droit.