PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Liste des fenêtres ouvertes sur le bureau
Liste des fenêtres ouvertes sur le bureau
Débuté par Sauveur CONSALVI, 20 sep. 2020 17:00 - 23 réponses
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 20 septembre 2020 - 17:00
Bonjour,
J'ai trouvé une multitude de question sur ce sujet
Ce code me donne bien les deux fenêtres ouvertes, mais il en affiche aussi d'autres !
Lg, Ok, hWnd sont des entiers
hWnd = AppelDLL32("User32", "GetWindow", Handle(), 2)
lpString est une chaîne fixe sur 255
TANTQUE hWnd <> 0
Lg = AppelDLL32("User32", "GetWindowTextLengthA", hWnd)
Ok = AppelDLL32("User32", "GetWindowTextA", hWnd, &lpString, Lg + 1)
SI Ok ALORS
SI AppelDLL32("user32","IsWindowVisible",hWnd) ALORS
// Trace(lpString)
ListeAjoute(LISTE_Processus,lpString) // LISTE _Processus et un contrôle LISTE
FIN
FIN //de Ok
// On passe à la fenêtre suivante...
hWnd = AppelDLL32("User32", "GetWindow", hWnd, 2)
FIN //de TANTQUE

Voici le résultat, mais pour moi, seul les deux premières listées sont "correctes" D'où vienne les autres ?



Comment faire pour n'avoir QUE les FENÊTRES OUVERTES sur le BUREAU ???
Cordialement
SC

--
Cordialement
SC
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 20 septembre 2020 - 17:45
bonjour
en ajoutant le test :
IF API("User32.dll", "IsWindowVisible",hWnd) THEN Trace(lpString)
es que cela résoud votre problème ?

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 20 septembre 2020 - 17:59
;(désolé je n'av&is pas vu que vous utilisier déja la fonction

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 20 septembre 2020 - 19:00
avec ce code vous devriez trouver une solution
stPOINT est une structure
sx est un entier système
sy est un entier système
END
stRECT est une structure
sleft est un entier système
top est un entier système
sright est un entier système
sbottom est un entier système
END

stWINDOWPLACEMENT est une structure
slength est un entier sans signe sur 4 octets
sflags est un entier sans signe sur 4 octets
sshowCmd est un entier sans signe sur 4 octets
sptMinPosition est un stPOINT
sptMaxPosition est un stPOINT
srcNormalPosition est un stRECT
srcDevice est un stRECT
END


Lg, Ok, hWnd sont des entiers
hWnd = AppelDLL32("User32", "GetWindow", Handle(), 2)
lpString est une chaîne fixe sur 255
WindowPlacement est une stWINDOWPLACEMENT

TANTQUE hWnd <> 0
Lg = AppelDLL32("User32", "GetWindowTextLengthA", hWnd)
Ok = AppelDLL32("User32", "GetWindowTextA", hWnd, &lpString, Lg + 1)
SI Ok ALORS
IF API("User32.dll", "IsWindowVisible",hWnd) THEN
WindowPlacement:slength = Dimension(WindowPlacement)
IF API("user32.dll","GetWindowPlacement", hWnd, &WindowPlacement) THEN
Trace(Remplace(lpString, Caract(0x0), "") + TAB + NumériqueVersChaîne(WindowPlacement:sflags) + TAB + NumériqueVersChaîne(WindowPlacement:sshowCmd))
FIN
FIN
END
hWnd = AppelDLL32("User32", "GetWindow", hWnd, 2)
END

Trace("------------------------")


--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 21 septembre 2020 - 09:48
Bonjour,
Merci de votre aide
sptMaxPosition est un stPOINT
srcNormalPosition est un stRECT

Sont en erreur, mais comme ils ne sont pas utilisés, je les ai mis en commentaire
Le résultat est plus "riche", mais en ne ne reprenant que
lpString
je retrouve les mêmes informations ...
Voici le résultat complet



Et le résultat allégé



Le gestionnaire des tâches répond pas lui aussi à mon besoin, car il n'a pas détecté Rainlendar (Calendar) ....




Comment améliorer le filtrage ?

--
Cordialement
SC
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 21 septembre 2020 - 11:03
J'ai une autre "expérience" ...
J'ai généré l'exécutable, j'ai fermé tout ce que je pouvais, et j'ai lancé l'EXE
J'ai aussi lancé le gestionnaire des tâches, et j'ai fait une copie écran du résultat, la voici



Je ne "pige" rien au résultat !
Il me faudrait une formation système sur Windows
Mais je me demande si l'on peut résoudre ce cas, puisque même les outils Windows ne le font pas

--
Cordialement
SC
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 21 septembre 2020 - 18:09
Bonjour
"Sont en erreur, mais comme ils ne sont pas utilisés, je les ai mis en commentaire" Bien sur qu'ils sont utilisés par la fonction : GetWindowPlacement, vu que l'on passe la taille de la structure. Quel est l'erreur ?

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 21 septembre 2020 - 18:27
il faut analyser la valeur de WindowPlacement:sshowCmd qui vous donne l'état de la fenêtre Pour cela voir https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-windowplacement

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 22 septembre 2020 - 12:05
Bonjour,
C'est le type stPOINT qui n'est pas reconnu et passe en erreur Les avoir passés en commentaire n'a pas fait d'erreur
Je vais voir pour WindowPlacement:sshowCmd, mais je ne pense pas réussir à coder en Windev

--
Cordialement
SC
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 22 septembre 2020 - 14:55
bonjour
stPOINT est une structure
sx est un entier système
sy est un entier système
END

" mais je ne pense pas réussir à coder en Windev" pourquois ? Quelle version de Windev ?

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 22 septembre 2020 - 16:47
Bonsoir,
Car je ne suis pas assez "calé" ...
Il donne un exemple en C++
Et je n'ai jamais manipulé les API
Cordialement
SC

--
Cordialement
SC
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 22 septembre 2020 - 17:07
Bonjour
Donnez moi l'exemple en C++ je devrais pouvoir vous le traduire

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 22 septembre 2020 - 17:16
C'est sympa ...
Voici
typedef struct tagWINDOWPLACEMENT {
UINT Length;
UINT flags;
UINT showCmd;
POINT ptMinPosition;
POINT ptMaxPosition;
RECT rcNormalPosition;
RECT rcDevice;
} WINDOWPLACEMENT;

Pris sur cette page :
https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-windowplacement
Merci

--
Cordialement
SC
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 22 septembre 2020 - 17:33
la traduction est celle que je vous ai donné...
stPOINT est une structure
sx est un entier système
sy est un entier système
END

stRECT est une structure
sleft est un entier système
top est un entier système
sright est un entier système
sbottom est un entier système
END

stWINDOWPLACEMENT est une structure
slength est un entier sans signe sur 4 octets
sflags est un entier sans signe sur 4 octets
sshowCmd est un entier sans signe sur 4 octets
sptMinPosition est un stPOINT
sptMaxPosition est un stPOINT
srcNormalPosition est un stRECT
srcDevice est un stRECT
END

TANTQUE hWnd <> 0
Lg = AppelDLL32("User32", "GetWindowTextLengthA", hWnd)
Ok = AppelDLL32("User32", "GetWindowTextA", hWnd, &lpString, Lg + 1)
SI Ok ALORS
IF API("User32.dll", "IsWindowVisible",hWnd) THEN
WindowPlacement:slength = Dimension(WindowPlacement) // très important ! slength = taille de la structure WindowPlacement
IF API("user32.dll","GetWindowPlacement", hWnd, &WindowPlacement) THEN
Trace(Remplace(lpString, Caract(0x0), "") + TAB + NumériqueVersChaîne(WindowPlacement:sflags) + TAB +
NumériqueVersChaîne(WindowPlacement:sshowCmd))
FIN
FIN
END
hWnd = AppelDLL32("User32", "GetWindow", hWnd, 2)
END

si vous avez une erreur faire une copie d'écran de votre code

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 23 septembre 2020 - 09:41
Bonjour,
En premier lieu, merci de votre dévouement et disponibilité
J'ai "modifié" le code pour avoir des boutons "indépendants" J'espère ne pas avoir fait d'erreur ...
stPOINT est une structure
sx est un entier système
sy est un entier système
END

stRECT est une structure
sleft est un entier système
top est un entier système
sright est un entier système
sbottom est un entier système
END

stWINDOWPLACEMENT est une structure
slength est un entier sans signe sur 4 octets
sflags est un entier sans signe sur 4 octets
sshowCmd est un entier sans signe sur 4 octets
sptMinPosition est un stPOINT
sptMaxPosition est un stPOINT
srcNormalPosition est un stRECT
srcDevice est un stRECT
END
WindowPlacement est une stWINDOWPLACEMENT

hWnd est un entier système // Type C :HWND
Lg, Ok sont des entiers
lpString est une chaîne fixe sur 255


// Récupération de la classe Windows de la fenêtre
hWnd = AppelDLL32("User32", "GetWindow", Handle(), 2)

TANTQUE hWnd <> 0
Lg = AppelDLL32("User32", "GetWindowTextLengthA", hWnd)
Ok = AppelDLL32("User32", "GetWindowTextA", hWnd, &lpString, Lg + 1)
SI Ok ALORS
IF API("User32.dll", "IsWindowVisible",hWnd) THEN
WindowPlacement:slength = Dimension(WindowPlacement) // très important ! slength = taille de la structure WindowPlacement
IF API("user32.dll","GetWindowPlacement", hWnd, &WindowPlacement) THEN
Trace(Remplace(lpString, Caract(0x0), "") + TAB + NumériqueVersChaîne(WindowPlacement:sflags) + TAB + NumériqueVersChaîne(WindowPlacement:sshowCmd))
ListeAjoute(LISTE_Processus,lpString)
FIN
FIN
END
hWnd = AppelDLL32("User32", "GetWindow", hWnd, 2)
END

Voici les copies écran du résultat, en test et par l'exécutable












Les fenêtres ouvertes sont bien détectées, mais d'autres processus aussi ...
Cordialement
SC

--
Cordialement
SC
Posté le 23 septembre 2020 - 10:46
Bonjour,

quelques ajouts et corrections signalér par //<<<<<<<<<<<

Procedure ListeFenêtresOuvertes()

stPoint est une structure
sx est un entier système
sy est un entier système
END
stRECT est une structure
Left est un entier système
top est un entier système
Right est un entier système
bottom est un entier système
END

stWINDOWPLACEMENT est une structure
slength est un entier sans signe sur 4 octets
sflags est un entier sans signe sur 4 octets
sshowCmd est un entier sans signe sur 4 octets
sptMinPosition est un stPoint
sptMaxPosition est un stPoint
srcNormalPosition est un stRECT
srcDevice est un stRECT
END

tabShowCmd est tableau associatif (*, *, wlEntier) de chaînes =...
[[0, "SW_HIDE"],
[1, "SW_SHOWNORMAL"],
[2, "SW_SHOWMINIMIZED"],
[3, "SW_MAXIMIZE"],
[3, "SW_SHOWMAXIMIZED"],
[4, "SW_SHOWNOACTIVATE"],
[5, "SW_SHOW"],
[6, "SW_MINIMIZE"],
[7, "SW_SHOWMINNOACTIV"],
[8, "SW_SHOWNA"],
[9, "SW_RESTORE"]
]

tabFlags est tableau associatif (*, *, wlEntier) de chaînes =...
[[1, "WPF_SETMINPOSITION"],
[2, "WPF_RESTORETOMAXIMIZED"],
[4, "WPF_ASYNCWINDOWPLACEMENT"]
]

Lg, Ok, hWnd sont des entiers
hWnd = AppelDLL32("User32", "GetWindow", Handle(), 2)
lpString est une chaîne fixe sur 255
WindowPlacement est une stWINDOWPLACEMENT

TANTQUE hWnd <> 0
Lg = AppelDLL32("User32", "GetWindowTextLengthA", hWnd)

lpString = Répète(Caract(0),255) //<<<<<<<<<<<

Ok = AppelDLL32("User32", "GetWindowTextA", hWnd, &lpString, Lg + 1)
SI Ok ALORS
IF API("User32.dll", "IsWindowVisible",hWnd) THEN

VariableRAZ(WindowPlacement) //<<<<<<<<<<<

WindowPlacement:slength = Dimension(WindowPlacement)
IF API("user32.dll","GetWindowPlacement", hWnd, &WindowPlacement) THEN
AVEC WindowPlacement
SI tabFlags[.sflags] <> "" ALORS //<<<<<<<<<<<
Trace(Remplace(lpString, Caract(0), "") + TAB + tabFlags[.sflags] + TAB + tabShowCmd[.sshowCmd], .srcNormalPosition.left, .srcNormalPosition.top, .srcNormalPosition.right - .srcNormalPosition.left, .srcNormalPosition.bottom - .srcNormalPosition.top)
FIN
FIN

FIN
FIN
END
hWnd = AppelDLL32("User32", "GetWindow", hWnd, 2)
END

Trace("------------------------")
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 23 septembre 2020 - 14:41
Bonjour,
Merci de votre aide
La fenêtre est détectée en mode test, rien en exécution
Rainlendar et FireFox ne sont pas détectés ...
J'ai ajouté en plus du TRACE la liste et INFO










--
Cordialement
SC
Membre enregistré
213 messages
Popularité : +12 (12 votes)
Posté le 04 février 2021 - 03:19
Bonsoir,

Comme j'ai un requis similaire je me permets un ajout.

Constantes à déclarer:
GW_HWNDFIRST = 0 // Première fenêtre selon le bon vouloir de Windows
GW_HWNDNEXT = 2 // Fenêtre suivante dans la liste

//--- Handle de fenêtre
es4WHandle est un entier

//--- Longueur du titre
esLongueur est un entier système

//--- Titre de la fenêtre
chiTitre est une chaîne

//--- Pour les besoins de la trace (Comment vivre sans X ?)
x est un entier

//--- Extrait le "handle" de la première fenêtre de la liste
es4WHandle = AppelDLL32("User32", "GetWindow", Handle(), GW_HWNDFIRST)


TANTQUE es4WHandle <> 0
x ++
//
//--- Est-ce bien une fenêtre ?
SI API("USER32", "IsWindowVisible", es4WHandle) <> 0 ALORS
//--- Contrôle visuel
SI EnModeTest() ALORS API("USER32","FlashWindow", es4WHandle, 1) // Flash On

//--- Extrait la longueur du titre de la fenêtre
esLongueur = API("USER32", "GetWindowTextLengthA", es4WHandle) + 1

//--- Prépare la chaîne
chiTitre = Répète(" ", esLongueur)

//--- Extrait le titre
API("USER32", "GetWindowTextA", es4WHandle, chiTitre, esLongueur)

//--- Retire le Null à la fin du titre
chiTitre = Gauche(chiTitre, esLongueur - 1)

//--- Trace
SI chiTitre <> "" ALORS Trace(x + "-" + chiTitre)
FIN

//--- Suivant dans la liste
es4WHandle = API("USER32", "GetWindow", es4WHandle, GW_HWNDNEXT)
FIN

L'API "FlashWindow" me permet de contrôler que la routine a bien détectée chaque fenêtre de la barre de tâches.
Incluant la fenêtre de test alors que j'exécute ce test depuis Windev.

J'ai bien quelques fenêtres de "process Windows" dans la liste, mais ça ne m'empêche pas de vivre.
8)

Bon dev.

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 04 février 2021 - 11:22
Bonjour,
Merci de ce code
Mais pour mon usage il reste encore trop de "process Windows" dans la liste, et je ne sais comment les identifier ...
Cdlt
SC





--
Cordialement
SC
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 04 février 2021 - 17:18
Bonjour,
J'ai bien téléchargé la Classe, et je l'ai incorporé à mon projet
Mais comment s'en servir ??? (Je n'ai pratiquement jamais utilisé de Classe, ni fait de POO)
J'ai créé une table "tabWinInfos", sans trop savoir quoi mettre comme colonne ...
Mais ensuite ?
Merci de votre aide

--
Cordialement
SC
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 04 février 2021 - 17:31
hello,
tabwininfos n'est pas une table mais un tableau de structure. Dans le lien il y a un exemple qui recherche la fenêtre de notepad et ses sous-fenêtres

--
Ami calmant, J.P
Membre enregistré
213 messages
Popularité : +12 (12 votes)
Posté le 05 février 2021 - 03:07
Jurassic,

Selon moi ta classe, tout comme ma suggestion, ne répond pas au besoin de Sauveur.

Tu n'aurais pas, dans l'une de tes classes, celle qui permet de ne lister QUE les fenêtres du Taskbar ?
Pas les icônes qui se trouvent sur la droite, mais bien les "fenêtres".

Je dois avouer que j'aimerais bien fouiller cette collection de classes que tu as.
:p

Bon dev.

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
373 messages
Popularité : +7 (7 votes)
Posté le 05 février 2021 - 07:42
Bonjour,
Merci à Serge qui a bien précisé mon besoin
Je veux pouvoir signaler à l'utilisateur les fenêtres ouverte sur le bureau Pas les processus actifs
J'espère qu'un spécialiste donneras la solution ...

--
Cordialement
SC