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

API -> Récupérer Handle de fenêtre ouverte par ShellExecute().

18 réponses
Avatar
teddy
Bonjour à tous,

Comme indiqué en objet, je cherche à récupérer le handle de la fenêtre ouverte par ShellExecute() qui m'ouvre en fait l'application
associée à un document (par exemple : pour un fichier CSV, ShellExecute() ouvre Excel sur mon poste).

D'abord je ne suis pas sûr du code retour de ShellExecute() en cas de succès : est-ce bien le N° d'instance de l'application lancée
ou bien est-ce un simple code d'erreur ?
Je sais qu'avec le N° d'instance, on peut trouver le handle de la fenêtre avec GetWindowThreadProcessId()

Des idées ?
Merci beaucoup pour vos suggestions.

Teddy

8 réponses

1 2
Avatar
teddy
Bonjour,

Avec une application connue (notepad par exemple...) et de plus en précisant
la fenêtre courante avec Me, on a évidemment le handle.

La question, c'est connaître le handle de la fenêtre d'une application
INCONNUE qui sera ouverte par ShellExecute() sachant que cette application
dépend du paramétrage INCONNU du poste (car ce n'est pas mon poste) quant à
l'association fichier (extension) - Application.
Par exemple, si je clique sur un fichier HTML dans l'explorateur Windows ou
un gestionnaire de fichiers, sur un poste je vais ouvrir 1 fenêtre Internet
Explorer, sur un autre ce sera peut-être Dreamweaver ou FireFox.

Donc, quelle est le handle de la fenêtre d'une application X qui sera
ouverte par ShellExecute ?

Teddy


"parci" a écrit dans le message de news:

On Fri, 8 Aug 2008 01:05:19 +0200, "LE TROLL" <le
wrote:

Mais n'est-ce pas ça la question, d'ouvrir une application et son fichier
avec shellexecut, et d'en récupérer le handel ???



C'est la question (en gros, parce que le handle de l'application?)
mais pas ta réponse.


Avatar
LE TROLL
Bonjour, bonjour :o)

Je tente de comprendre, mais je fais rarement du réseau, alors je ne
suis guère compétent, mais... si c'est ouvert avec "shelleexecut API", c'est
donc que l'API est appelée dans un programme, donc le programme passe des
paramètres de logiciels et de fichier à l'API, donc par ce biais tu sais ce
qui a été appelé, en faisant un fichier par exemple, et en l'effaçant à la
fermeture (la ligne appelée)... à moins que tu ne puisses intervenir sur les
programmes qui lance par shelleExecut, qu'ils ne soient pas de toi ???

Que je m'explique, si toutefois c'est dans le sens d'une solution.
Sur le poste p1, on lance par shelleexecut (se) le logiciel l1 avec aussi le
fichier f1, qui attribue le handle h1.
On peut normalement récupérer ces 3 infos et les stocker dans un fichier
mouchard m1, soit l1 + f1 + h1.

Tu peux même faire mieux, en écrivant tout sur ton disque (serveur ou poste
délocalisé), ainsi tu n'as qu'un fichier avec P, L, F et H dans chaque ligne
de l'unique fichier mouchard m.

Donc, il te suffit ensuite de parcourir touts les fichiers mouchards m1...
des postes p1... et de lire chaque ligne, afin de savoir ce que le poste a
ouvert via ton programme, donc via l'API se... et de connaître l1, f1 et
h1...
Et à la fermeture, on efface la ligne du mouchard f1. Etc...
---------------
En d'autres termes, on peut tout à fait depuis chaque programme moucharder
tout ce qui est appelé, ouvert, fermé... principe du fichier log...
Je présume que tu veux cette info pour fermer de force à distance, ou
réguler, gérer...

Est-ce une solution ???

--
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
" teddy" a écrit dans le message de news:
egA1pbf%
| Bonjour,
|
| Avec une application connue (notepad par exemple...) et de plus en
précisant
| la fenêtre courante avec Me, on a évidemment le handle.
|
| La question, c'est connaître le handle de la fenêtre d'une application
| INCONNUE qui sera ouverte par ShellExecute() sachant que cette application
| dépend du paramétrage INCONNU du poste (car ce n'est pas mon poste) quant
à
| l'association fichier (extension) - Application.
| Par exemple, si je clique sur un fichier HTML dans l'explorateur Windows
ou
| un gestionnaire de fichiers, sur un poste je vais ouvrir 1 fenêtre
Internet
| Explorer, sur un autre ce sera peut-être Dreamweaver ou FireFox.
|
| Donc, quelle est le handle de la fenêtre d'une application X qui sera
| ouverte par ShellExecute ?
|
| Teddy
|
|
| "parci" a écrit dans le message de news:
|
| > On Fri, 8 Aug 2008 01:05:19 +0200, "LE TROLL" <le
| > wrote:
| >
| >>Mais n'est-ce pas ça la question, d'ouvrir une application et son
fichier
| >>avec shellexecut, et d'en récupérer le handel ???
| >
| > C'est la question (en gros, parce que le handle de l'application?)
| > mais pas ta réponse.
|
|
Avatar
teddy
Heu non, ce n'est pas vraiment la solution.
En fait, il me faut chercher dans les API lesquelles peuvent apporter cette
information de handle de fenêtre.
Il faut peut-être passer par le n° d'instance puis avec ce n° obtenir le
handle de la fenêtre.
Il y a plein d'exemples totalement incomplets sur le net.

Ted


"LE TROLL" <le a écrit dans le message de news:
OuXxV3g%
Bonjour, bonjour :o)

Je tente de comprendre, mais je fais rarement du réseau, alors je ne
suis guère compétent, mais... si c'est ouvert avec "shelleexecut API",
c'est
donc que l'API est appelée dans un programme, donc le programme passe des
paramètres de logiciels et de fichier à l'API, donc par ce biais tu sais
ce
qui a été appelé, en faisant un fichier par exemple, et en l'effaçant à la
fermeture (la ligne appelée)... à moins que tu ne puisses intervenir sur
les
programmes qui lance par shelleExecut, qu'ils ne soient pas de toi ???

Que je m'explique, si toutefois c'est dans le sens d'une solution.
Sur le poste p1, on lance par shelleexecut (se) le logiciel l1 avec aussi
le
fichier f1, qui attribue le handle h1.
On peut normalement récupérer ces 3 infos et les stocker dans un fichier
mouchard m1, soit l1 + f1 + h1.

Tu peux même faire mieux, en écrivant tout sur ton disque (serveur ou
poste
délocalisé), ainsi tu n'as qu'un fichier avec P, L, F et H dans chaque
ligne
de l'unique fichier mouchard m.

Donc, il te suffit ensuite de parcourir touts les fichiers mouchards m1...
des postes p1... et de lire chaque ligne, afin de savoir ce que le poste a
ouvert via ton programme, donc via l'API se... et de connaître l1, f1 et
h1...
Et à la fermeture, on efface la ligne du mouchard f1. Etc...
---------------
En d'autres termes, on peut tout à fait depuis chaque programme moucharder
tout ce qui est appelé, ouvert, fermé... principe du fichier log...
Je présume que tu veux cette info pour fermer de force à distance, ou
réguler, gérer...

Est-ce une solution ???

--
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
" teddy" a écrit dans le message de news:
egA1pbf%
| Bonjour,
|
| Avec une application connue (notepad par exemple...) et de plus en
précisant
| la fenêtre courante avec Me, on a évidemment le handle.
|
| La question, c'est connaître le handle de la fenêtre d'une application
| INCONNUE qui sera ouverte par ShellExecute() sachant que cette
application
| dépend du paramétrage INCONNU du poste (car ce n'est pas mon poste)
quant
à
| l'association fichier (extension) - Application.
| Par exemple, si je clique sur un fichier HTML dans l'explorateur Windows
ou
| un gestionnaire de fichiers, sur un poste je vais ouvrir 1 fenêtre
Internet
| Explorer, sur un autre ce sera peut-être Dreamweaver ou FireFox.
|
| Donc, quelle est le handle de la fenêtre d'une application X qui sera
| ouverte par ShellExecute ?
|
| Teddy
|
|
| "parci" a écrit dans le message de news:
|
| > On Fri, 8 Aug 2008 01:05:19 +0200, "LE TROLL" <le
| > wrote:
| >
| >>Mais n'est-ce pas ça la question, d'ouvrir une application et son
fichier
| >>avec shellexecut, et d'en récupérer le handel ???
| >
| > C'est la question (en gros, parce que le handle de l'application?)
| > mais pas ta réponse.
|
|




Avatar
Jean-marc
teddy wrote:
Heu non, ce n'est pas vraiment la solution.
En fait, il me faut chercher dans les API lesquelles peuvent apporter
cette information de handle de fenêtre.
Il faut peut-être passer par le n° d'instance puis avec ce n° obtenir
le handle de la fenêtre.
Il y a plein d'exemples totalement incomplets sur le net.



Hello,

Il est entendu que ShellExecute ne retourne pas un numéro d'instance:
C'est précisé dans la doc Microsoft (cf. MSDN:
http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx)

Donc pas de moyen évident de récupérer le handle de la fenêtre
que tu viens de lancer.

Une solution peut être possible (quoique vraiement bourrine):
- Avant ton ShellExecute, lister toutes les fenêtres ouvertes
- Puis lancer ton ShellExecute
- Juste après, lister à nouveau les fenêtres ouvertes

Sous certaines conditions, on doit pouvoir retrouver celle
qui vient d'être ouverte et qui devrait donc être la fenêtre
créée par ton Shell Execute.

Pas très joli...

En tout cas, pas de solution directe avec ShellExecute, ça c'est sur.

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
teddy
Oui, ShellExecute() ne donne aucune information utile pour déterminer le
numéro de handle de la fenêtre.
J'ai trouvé sur le net un exemple incomplet où l'on récupère des
informations via une autre fct API (n° d'instance) après ShellExecute puis
avec ce numéro on cherche le handle mais c'est très tordu et sans
explications.
Si je trouve quelque chose de clair, je reviendrai ici pour donner
l'information.

Ted

"Jean-marc" a écrit dans le message de news:
489ebaf7$0$2854$
teddy wrote:
Heu non, ce n'est pas vraiment la solution.
En fait, il me faut chercher dans les API lesquelles peuvent apporter
cette information de handle de fenêtre.
Il faut peut-être passer par le n° d'instance puis avec ce n° obtenir
le handle de la fenêtre.
Il y a plein d'exemples totalement incomplets sur le net.



Hello,

Il est entendu que ShellExecute ne retourne pas un numéro d'instance:
C'est précisé dans la doc Microsoft (cf. MSDN:
http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx)

Donc pas de moyen évident de récupérer le handle de la fenêtre
que tu viens de lancer.

Une solution peut être possible (quoique vraiement bourrine):
- Avant ton ShellExecute, lister toutes les fenêtres ouvertes
- Puis lancer ton ShellExecute
- Juste après, lister à nouveau les fenêtres ouvertes

Sous certaines conditions, on doit pouvoir retrouver celle
qui vient d'être ouverte et qui devrait donc être la fenêtre
créée par ton Shell Execute.

Pas très joli...

En tout cas, pas de solution directe avec ShellExecute, ça c'est sur.

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
Vincent Guichard
teddy a écrit :
Bonjour à tous,

Comme indiqué en objet, je cherche à récupérer le handle de la fenêtre
ouverte par ShellExecute() qui m'ouvre en fait l'application associée à
un document (par exemple : pour un fichier CSV, ShellExecute() ouvre
Excel sur mon poste).

D'abord je ne suis pas sûr du code retour de ShellExecute() en cas de
succès : est-ce bien le N° d'instance de l'application lancée ou bien
est-ce un simple code d'erreur ?
Je sais qu'avec le N° d'instance, on peut trouver le handle de la
fenêtre avec GetWindowThreadProcessId()

Des idées ?
Merci beaucoup pour vos suggestions.

Teddy




Il doit y avoir moyen de récupérer les infos dont tu as besoin en
utilisant CreateProcess au lieu de ShellExecute. cela implique
probablement d'aller chercher soit-même l'application associée au
fichier, et je ne sais pas si il existe une solution simple pour y
arriver (à part lire la BDR, bien sûr)

Vincent Guichard
Avatar
teddy
C'est effectivement une piste à creuser.



"Vincent Guichard" a écrit dans le message de
news: 48a2a076$0$939$
teddy a écrit :
Bonjour à tous,

Comme indiqué en objet, je cherche à récupérer le handle de la fenêtre
ouverte par ShellExecute() qui m'ouvre en fait l'application associée à un
document (par exemple : pour un fichier CSV, ShellExecute() ouvre Excel
sur mon poste).

D'abord je ne suis pas sûr du code retour de ShellExecute() en cas de
succès : est-ce bien le N° d'instance de l'application lancée ou bien
est-ce un simple code d'erreur ?
Je sais qu'avec le N° d'instance, on peut trouver le handle de la fenêtre
avec GetWindowThreadProcessId()

Des idées ?
Merci beaucoup pour vos suggestions.

Teddy




Il doit y avoir moyen de récupérer les infos dont tu as besoin en
utilisant CreateProcess au lieu de ShellExecute. cela implique
probablement d'aller chercher soit-même l'application associée au
fichier, et je ne sais pas si il existe une solution simple pour y
arriver (à part lire la BDR, bien sûr)

Vincent Guichard
Avatar
Vincent Guichard
teddy a écrit :
C'est effectivement une piste à creuser.




FindExecutable pour trouver l'application associée.
Shell ou CreateProcess pour lancer l'application et récupérer le
ProcessID (Shell est plus simple si tu n'as besoin que du processID).
GetWindowThreadProcessId en parcourant les fenêtres pour avoir le hWnd.

Après je ne sais pas comment cela se comporte dans le cas des liens DDE
par exemple.

Vincent Guichard
1 2