Question


J'ai une application (WinForms) qui télécharge un fichier dans le dossier temporaire de l'utilisateur, il ouvre le fichier pour l'utilisateur de voir le contenu, et lorsque le fichier est fermé, le fichier est supprimé du dossier temp. L'application fonctionne ok si j'ouvre disons un .pdf et un .doc Le problème apparaît lorsque vous essayez d'ouvrir un .doc si un autre processus de winword runing encore (peu importe si est ouverte par mon application ou directement par l'utilisateur) .

J'utilise le code suivant:

_OpenFileProces = System.Diagnostics.Process.Start(TempFileName);
_OpenFileProces.EnableRaisingEvents = true;
_OpenFileProces.Exited += new EventHandler(_OpenFileProces_Exited);

et celui-ci à température clair

void _OpenFileProces_Exited(object sender, EventArgs e)
    {
        string s = ((System.Diagnostics.Process)sender).StartInfo.FileName;
        System.IO.File.Delete(s);
    }

Il semble que le processus en cours d'exécution est d'arrêter mon .. et en raison de l'arrêter supprimera le fichier ou il va générer une erreur en essayant de supprimer le fichier.
Avez-vous une suggestion comment puis-je ouvrir mon propre processus? La chose est que je ne sais pas quel type de fichier que je dois ouvrir (il pourrait être quelque chose) et je compte sur les fenêtres pour choisir la meilleure application. de mon test, bloc-notes fonctionne bien, mais winword et acrobate ferme mon processus.
Merci

Était-ce utile?

La solution

Je soupçonne que Microsoft Word fait exactement la même chose ici que Raymond Chen décrit le Shell Windows comme faisant :

Un client avait besoin d'aide à la surveillance de la durée de vie d'une fenêtre de l'Explorateur.

" Nous voulons lancer une copie de l'Explorateur pour ouvrir un dossier spécifique, puis attendre jusqu'à ce que l'utilisateur ferme le dossier avant de continuer. Nous avons essayé de lancer une copie de l'Explorateur avec le dossier sur la ligne de commande, puis en faisant une WaitForSingleObject sur la poignée de processus, mais l'attente se termine parfois immédiatement, sans attendre. Comment pouvons-nous attendre jusqu'à ce que l'utilisateur ferme la fenêtre Explorer? "

Ceci est un autre cas de résoudre un problème à mi-chemin et ayant des problèmes avec l'autre moitié.

La raison pour laquelle le rendement de Wait­For­Single­Object est immédiatement Explorer est un programme unique instance (bien, instance limitée). Lorsque vous ouvrez une fenêtre Explorer, la demande est transférée à une copie en cours d'exécution de l'explorateur, et la copie de l'explorateur vous a lancé des sorties. C'est pourquoi vos déclarations de Wait­For­Single­Object immédiatement.

Dans votre cas, Word est déjà en cours d'exécution, de sorte que lorsque vous créez un secondes processus Word et Instruire pour ouvrir votre document, il remet simplement la demande de l'instance de Word qui est déjà en cours d'exécution et se ferme le deuxième processus que vous avez lancé immédiatement.

C'est ce que vous voyez quand vous décrivez que « le processus en cours d'exécution est d'arrêter mon propre ». Parce que deuxième instance se ferme immédiatement après son lancement, l'événement Exited est élevé et votre code, il dit de supprimer le fichier!

Vous observez que le Bloc-notes astucieusement (contrairement à Word et Adobe Acrobat) fonctionne très bien. En effet, le Bloc-notes est conçu pour être une application multi-instances. Vous pouvez ouvrir autant de copies du Bloc-notes que vous voulez; il ne se soucie pas s'il y a déjà 1 ou 6 copies ouvertes sur le bureau. Et plus important encore, de demander la coquille d'ouvrir un document texte dans le Bloc-notes ouvre en fait un secondes copie de l'application Bloc-notes, plutôt que d'envoyer une demande au premier par exemple à une ouverture nouvelle fenêtre pour le nouveau document.

Autres conseils

Vous devez définir la Process.StartInfo.UseShellExecute à true comme celui-ci _OpenFileProces.StartInfo.UseShellExecute = true; avant de commencer le processus et il devrait fonctionner je pense ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top