Lancer exe en transparent avec en paramètre un fichier ini

Signaler
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009
-
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009
-
Bonjour,
Je voulais savoir s'il était possible de lancer une application en transparent sachant qu'elle est associée à un fichier ini.
J'ai essayé de lancer l'application de la façon suivante :
pid2 = (Shell("Mon_appli.exe, vbNormalNoFocus))
handappli = InstanceToWnd(pid2)
SetWindowLong handappli, GWL_EXSTYLE, GetWindowLong(handappli, GWL_EXSTYLE) Or WS_EX_LAYERED
SetLayeredWindowAttributes handappli, 0, 125, LWA_ALPHA
L'application est bien lancée en transparent.

Mais par contre quand je fais ceci :
pid2 = (Shell("Mon_appli.exe  FICHIERDECONFIG|mon_fichier.ini", vbNormalNoFocus))
handappli = InstanceToWnd(pid2)
SetWindowLong handappli, GWL_EXSTYLE, GetWindowLong(handappli, GWL_EXSTYLE) Or WS_EX_LAYERED
SetLayeredWindowAttributes handappli, 0, 125, LWA_ALPHA
L'application ne se lance pas en transparent.

J'aimerais savoir d'où vient le problème

Merci.

19 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
utilises ShellExecute, plutot que Shell

plus fiable pour le passage de parametres
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009

Je viens de tester votre solution mais j'ai toujours le même problème.
Est-ce que cela peut venir de l'application à lancer?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
quel est ton code actuel ?

a voir en debug si tu récupères bien handappli
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009

Voilà le code que j'ai mis
pid2 = ShellExecute(0, "open", "mon_appli.exe", " FICHIERDECONFIG|mon_fichier.ini", 0&, 0&)
handappli = InstanceToWnd(pid2)
SetWindowLong handappli, GWL_EXSTYLE, GetWindowLong(handappli, GWL_EXSTYLE) Or WS_EX_LAYERED
SetLayeredWindowAttributes handappli, 0, 125, LWA_ALPHA

Le premier paramètre de shellexecute je l'ai mis à zéro car je ne connait pas encore son handle. Le problème vient surement de là car le handappli reste à zéro.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
ok pour le 0& au premier parametre (utile uniquement pour établir une dépendance entre fenetres, mais bon...)

handappli restera à 0 tant que tu n'aura pas récupéré le PID de ton appli.
logique, puisque c'est ce qu'exploite InstanceToWnd ^^

regarde la doc de ShellExecute, ca t'en dira plus.
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009

J'ai récupéré le handle de mon application grâce à la fonction FindWindow mais on revient au point de départ car l'application n'est pas transparente.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
et sans ce fichier ini ca fonctionne ?

que fais ton appli avec ce fichu fichier ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
tu as testé le code retour de SetLayeredWindowAttributes ?
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009

le fichier ini permet de faire la connexion à une base de données et sans ce fichier en paramètre dans un shell l'application apparait en transparent
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009

le code retour de SetLayeredWindowAttributes est 0
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
http://msdn.microsoft.com/en-us/library/ms633540(VS.85).aspx

If the function fails, the return value is zero. To get extended error information, call GetLastError.

que nous donne err.LastDllError ? (equivalent de GetLastError)

voir le message en clair ici

http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009

J'ai utilisé GetlastError. La fonction me renvoie le code error 1400 qui correspond Invalid window handle. ERROR_INVALID_WINDOW_HANDLE.

Existe une autre solution que de passer par findwindow pour récupérer le handle
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
tu peux enumérer les fenetres de l'appli lancée...
mais FindWindow me semble un bon point de départ.

lances SPY++ pour t'assurer que le handle que tu trouves est le bon...
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009

A cause d'un copier coller, j'avais oublié de renommer une variable. Donc maintenant le code error de GetLastError est à 0 mais la fenêtre n'est toujours pas transparente !!
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
SetLayeredWindowAttributes est à 0 et Err.LAstDllError aussi ?

aïe.
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009

SetLayeredWindowAttributes est à 0 et GetLastError est à 1400
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009

Comment peut-on récupérer le PID directement sans passer par findwindow car je peut avoir plusieurs fois l'application lancée?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
utilises plutot ShellExecuteEx, si tu souhaites piquer des infos sur le process lancé, comme l'indique la doc de ShellExecute
Messages postés
11
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
31 août 2009

J'ai recommencé avec ShellExecuteEx.
J'ai les codes retour suivant :


SetLayeredWindowAttributes est à 1
GetLastError est à 0.

L'application n'est toujours pas transparente !