Ouvrir des documents dans la même instance de l'application sans relancement de l'exe (dde) en .net

0/5 (8 avis)

Vue 10 331 fois - Téléchargée 490 fois

Description

Dans VB2005, il existe une option pour rendre une application "à instance unique" et pouvoir récupérer dans l'instance ouverte une liste des fichiers sur lesquels l'utilisateur a cliqué...Sous Visual C#, il n'existe pas encore cette option...

Ce code permet donc d'ouvrir, imprimer... un ou plusieurs documents dans la même instance d'une application ouverte (ou fermée).
Lorqu'une association de fichier paramètre l'utilisation de DDE, un message WM_DDE_INITIATE est envoyé à toutes les fenêtres au premier plan avec le nom de l'application visée par l'action... si une application répond par WM_DDE_ACK, le shell renvoie un message WM_DDE_EXECUTE avec l'action (et le nom de fichier) à accomplir.
Ainisi, en interceptant ces messages, on peut exécuter une action comme ouvrir un document dans un instance en cours d'une application sans relancement de l'exe et sans ligne de commande...de plus, cela permet d'ouvrir plusieurs fichiers à la fois sans lancer autant d'instance que de fichiers...

Conclusion :


A noter aussi que cette méthode est officielle (mais pas surdocumentée) contrairement à d'autres...

Ce code crée une association de fichier .XYZ et utilise cette extension pour DDE...

N'hésitez pas à commenter et à noter...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
godvicien
Messages postés
36
Date d'inscription
dimanche 23 janvier 2005
Statut
Membre
Dernière intervention
6 avril 2014

17 mars 2008 à 15:22
Bon il me reste en effet un ultime bug de première ouverture de fichier.
On dirait que ca viens de l'OS.

Sinon j'ai une petite question : Ca sert à quoi ca :
_ddeListener.SubClass = true/false;

Ca veut dire quoi : "définit ou renvoie l'état du subclassing de la form" ??
godvicien
Messages postés
36
Date d'inscription
dimanche 23 janvier 2005
Statut
Membre
Dernière intervention
6 avril 2014

16 mars 2008 à 16:12
Excellent !

Tout fonctionne sur mon soft, le transfert c'est fait sans problème.

En ce qui concerne la class EXTAssociation je la trouve très lourde, le framework .NET permet de manipuler les clés de registre beaucoup plus facilement.

Alors pour la remplacer il faut créer votre classe et bien suivre ce schéma de la base de registre :
(que vous pouvez stocker dans un fichier .reg, c'est ce que je fais pour outrepasser les droits de vista)
Il suffit de remplacer 'ed2k' par votre extension '.xyz'. En effet on peut créer son propre type de liens comme dans cette exemple :

[FichierTexte.reg]
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\ed2k]
@="URL: ed2k Protocol"
"URL Protocol"=""
; cette ligne précédente est indispensable pour créer un protocole style "ed2K://votre_URL"

[HKEY_CLASSES_ROOT\ed2k\DefaultIcon]
@="C:\\Program Files\\eMule\\eMule.exe,0"

[HKEY_CLASSES_ROOT\ed2k\shell]
@="open"

[HKEY_CLASSES_ROOT\ed2k\shell\open]

[HKEY_CLASSES_ROOT\ed2k\shell\open\command]
@=""C:\\Program Files\\eMule\\eMule.exe" "%1""

[HKEY_CLASSES_ROOT\ed2k\shell\open\ddeexec]
@="[peeurl("%1")]"

[HKEY_CLASSES_ROOT\ed2k\shell\open\ddeexec\Application]
@="eMule.exe"

[HKEY_CLASSES_ROOT\ed2k\shell\open\ddeexec\Topic]
@="P2P"

/FichierTexte.reg

Et lancer l'écoute des messages DDE avec ce code dans votre FormMain.Load() :

_ddeListener = new DDEListener(this.Handle, "eMule.exe", "P2P");
_ddeListener.OnReceiveCommand += new DDEListener.OnReceiveCommandDelegate(DDEListener_OnReceiveCommand);
_ddeListener.SubClass = true;

Et dans votre FormMain.Closing :
_ddeListener.SubClass = false;

Voila j'espère avoir bien résumer le tout. Un grand merci pour cette source parfaitement documentée.
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
16 mars 2008 à 10:30
salut,

pour vista, je pense effectivement qu'il faut être administrateur (et même run as administrator)...

pour le bug du premier lancement, effectivement, si je me souviens bien, je n'ai pas mis de traitement de ligne de commande...je mettrais à jour prochainement...

ShareVB
godvicien
Messages postés
36
Date d'inscription
dimanche 23 janvier 2005
Statut
Membre
Dernière intervention
6 avril 2014

15 mars 2008 à 22:43
Excellent code. C'est exactement ce qu'il me fallait ;-)

Sur vista la classe EXTAssociation ne fonctionne pas. Surement du aux nouveaux droits d'accès à la base de registre.

Sinon en effet le premier double clic sur un fichier .xyz ouvre le soft, mais comme celui ci ne gére pas les lignes de commande il n'affiche pas de "open 1 params. nom_du_fichier.xyz".

Y aurait-il un bug de trouvage de fichier *.exe "%1" ??
nerix27
Messages postés
86
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
21 juin 2007
2
14 juin 2007 à 17:23
Petit bémol à ton appli quand même : j'ouvre une fois l'appli pour bien enregistrer le type de fichierr xyz. Je lance plusieurs fichiers par ci par là sur le dique, juste une instance donc tout va bien.
Mais dès que je ferme l'appli, et que je lance direct un fichier (l'ouverture de ce fichier est sensé créer l'instance unique), j'ai la même erreur que dans mon message ci-dessus. L'appli s'ouvre bien quand même, et l'ouverture d'autres fichiers par dessus ne pose pas de problème.
Donc technique pas très au point. As-tu quelques éclaircissements là dessus ?

D'avance merci...
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.