Du code que j'avais écrit en 16 bits (pas top top, suis amateur, mais ça fonctionne en 32 bits aussi). Y a sans doute plus synthétique, plus pur_API_sé.
Cf si qq chose utile à en extraire (j'ai enlevé du code sans intérêt ici)
BOOL TestSiUnique(LPSTR lpCmdLine)
{
// Cherche une occurence du programme courant par son titre.
// Passe en revue toutes les applications qui tournent.
//
// Si trouvé, retourne False et remet l'application en avant plan
// sinon, retourne True
//
HWND hWnd;
hWnd = GetTopWindow(NULL);
while (hWnd != NULL)
{
if ((IsWindowVisible(hWnd) != 0) &&
(IsWindowEnabled(hWnd) != 0))
{
long TL;
// On n'a ici que les noms de feuilles ppales "visibles"
// Si pas test, on trouve aussi ce qui est en "arrière-plan"
TL = GetWindowLong(hWnd, GWL_STYLE);
if ((TL & WS_POPUP) != WS_POPUP)
{ // != WS_POPUP donne nom de titres de fenêtres
// == WS_POPUP donne le nom des applications
char WName[256]; // ? Taille maxi de chaîne ?
WName[0] = '\0';
GetWindowText(hWnd, WName, sizeof(WName));
if (strstr(WName, ChneTitr) != NULL)
{ // montre l'autre session (icône ou cachée)
if (IsIconic(hWnd) != 0) // minimisée
OpenIcon(hWnd);
else
SetWindowPos(hWnd, hwEtat, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE);
// envoie message pour dire à la session déja ouverte "y a un fichier à lire"
// et lui passe le nom complet pour action.
// Action (top secrète, sans utilité ici)
return FALSE;
}
}
}
hWnd = GetWindow(hWnd, GW_HWNDNEXT);
}
return TRUE;
}
// fin de module TestSiUnique