Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

API win32 et gestion d'applications (background/foreground)

0 views
Skip to first unread message

Altaïr

unread,
Apr 22, 2008, 4:48:33 AM4/22/08
to
Bonjour à tous,

je développe actuellement une application en C (avec Labwindows CVI
pour être précis).
Avec cette première application, je lance une seconde qui est déjà
codée et que je ne peux pas modifier. Ces deux applications
communiquent entre elles grace à des échanges TCP et jusque là tout va
bien.
Je souhaiterais que la seconde application reste au premier plan
lorsque je le désire car pour le moment la première application sur
laquelle l'utilisateur travaille prend sa place dans le foreground.

Je me suis renseigné sur l'API win32 et j'ai appris à créer des
fenêtres, à y associer des controles et à les faire passer au premier
plan. J'ai réussi en outre à trouver le HWND et le HINSTANCE de la
seconde application mais l'utilisation des fonctions SetActiveWindow()
ou SetForegroundWindow() ne sont pas concluantes. L'application reste
au second plan.

Est-il possible d'insérer ma deuxième application dans une fenêtre
créée par la première application afin de pouvoir gérer le foreground
grâce aux deux fonctions évoquées précédemment?
Si non, auriez vous une solution en tête ou d'autres fonctions de
l'API pouvant m'aider?

Merci beaucoup du temps que vous m'accordez.

Altaïr

Christian ASTOR

unread,
Apr 22, 2008, 6:08:57 AM4/22/08
to
On 22 avr, 10:48, Altaïr <altair_...@hotmail.com> wrote:

> Je me suis renseigné sur l'API win32 et j'ai appris à créer des
> fenêtres, à y associer des controles et à les faire passer au premier
> plan. J'ai réussi en outre à trouver le HWND et le HINSTANCE de la
> seconde application mais l'utilisation des fonctions SetActiveWindow()
> ou SetForegroundWindow() ne sont pas concluantes. L'application reste
> au second plan.

SetForegroundWindow() a des limitations à contourner (KB97925 :
AttachThreadInput(), SPI_SETFOREGROUNDLOCKTIMEOUT)
Sinon, SwitchToThisWindow() marche généralement.

Altaïr

unread,
Apr 22, 2008, 12:36:04 PM4/22/08
to
> SetForegroundWindow() a des limitations à contourner (KB97925 :
> AttachThreadInput(), SPI_SETFOREGROUNDLOCKTIMEOUT)
> Sinon, SwitchToThisWindow() marche généralement.

Merci pour ta réponse Christian.

A propos de AttachThreadInput():
Jusqu'à présent j'obtenais le HWND de la seconde application à son
lancement par une fonction Labwindows. Mais je me suis rendu compte
qu'en appliquant GetWindowThreadProcessId() avec cette valeur,
j'obtenais le même Id que pour ma première application...

J'ai donc du mal à obtenir la liste des threads composants ma seconde
application. Avec cette liste je pourrais réaliser un
SetForegroundWindow() sur chacune des fenêtres composant les threads
(ce que je sais faire).

Altaïr

unread,
Apr 23, 2008, 5:46:13 AM4/23/08
to

> J'ai donc du mal à obtenir la liste des threads composants ma seconde
> application. Avec cette liste je pourrais réaliser un
> SetForegroundWindow() sur chacune des fenêtres composant les threads
> (ce que je sais faire).

J'arrive désormais à lister tous les threads et identifier leur
windows respectives. Il me reste désormais à pouvoir identifier les
threads qui correspondent à ma seconde application... Si quelqu'un a
une idée...

Merci.

Christian ASTOR

unread,
Apr 23, 2008, 8:39:00 AM4/23/08
to
On 22 avr, 18:36, Altaïr <altair_...@hotmail.com> wrote:
> > SetForegroundWindow() a des limitations à contourner (KB97925 :
> > AttachThreadInput(), SPI_SETFOREGROUNDLOCKTIMEOUT)
> > Sinon, SwitchToThisWindow() marche généralement.
>
> Merci pour ta réponse Christian.
>
> A propos de AttachThreadInput():
> Jusqu'à présent j'obtenais le HWND de la seconde application à son
> lancement par une fonction Labwindows. Mais je me suis rendu compte
> qu'en appliquant GetWindowThreadProcessId() avec cette valeur,
> j'obtenais le même Id que pour ma première application...

J'ai du mal à comprendre...
Si je lance une autre appli, comme Notepad par ex :
ShellExecute(NULL, "", "notepad", "", "", SW_SHOW);

Et si je fais :
HWND hWndNotepad = FindWindow("Notepad",NULL );
DWORD dwProcessID;
DWORD dwThreadId = GetWindowThreadProcessId(hWndNotepad,
&dwProcessID);

dwThreadId ne peut pas être égal à GetCurrentThreadId()

Si on veut mettre au premier plan Notepad, on peut faire :

SwitchToWindow(hWndNotepad);

avec :

void SwitchToWindow(HWND hWnd)
{
if (IsIconic(hWnd))
ShowWindow(hWnd, SW_RESTORE);
HWND hWndLastActivePopup = GetLastActivePopup(hWnd);
void (FAR STDAPICALLTYPE * pSTTW)(HWND hWnd, BOOL bAltTab);
HINSTANCE hInst = LoadLibrary("USER32.DLL");
if (hInst)
{
(FARPROC&)pSTTW = GetProcAddress(hInst, "SwitchToThisWindow");
if (pSTTW != NULL)
pSTTW(hWndLastActivePopup, TRUE);
FreeLibrary(hInst);
}
}

Altaïr

unread,
Apr 24, 2008, 5:07:47 AM4/24/08
to
Merci. J'ai finalement réussi avec une méthode assez "buldozer".
J'aurais du utiliser ShellExecute et FindWindows pour obtenir le
handle de la fenêtre. La complication venait du fait que j'utilisais
des fonctions CVI pour lancer l'application et la fermer.

Merci beaucoup pour ce code.

0 new messages