2 votes

Détecter si Adobe Acrobat Reader sur .NET est en cours d'exécution

J'utilise PDFSharp pour créer un PDF. Dans leurs exemples, ils enregistrent un PDF et ensuite ils lancent un processus pour choisir votre visualisateur pour l'ouvrir. Cela ressemble à ceci :

document.Save(fileName);
Process.Start(fileName);    

Lors de mes tests, je me suis rendu compte que si Acrobat Reader est déjà ouvert, je reçois une exception d'entrée/sortie car le processus est déjà en cours d'exécution. J'ai donc essayé de suivre ce post : Détection d'un processus déjà en cours d'exécution dans Windows à l'aide de C# .net

sur la détection du processus. J'ai donc changé le code ci-dessus en ceci :

        document.Save(fileName);
        if (System.Diagnostics.Process.GetProcessesByName("AcroRd32.exe").Length == 0)
        {
            Process.Start(fileName);    
        }

J'ai donc deux questions.
1) Cela ne fonctionne pas. La longueur est toujours de 0. Je me demande donc si je renvoie le mauvais processus ou s'il ne trouve pas le processus. Lorsque je regarde dans le gestionnaire des tâches, AcroRd32.exe est le nom du processus en cours d'exécution.

2) Existe-t-il une meilleure façon de procéder ? J'ai l'impression que ce processus est codé en dur dans le code et je n'étais pas sûr qu'il y ait un meilleur moyen de prendre en charge d'autres versions d'Acrobat (par exemple, s'il existe une version 64 bits) ou d'autres visionneurs de PDF en général.

Désolé si c'est une question de débutant. Ce .NET est assez nouveau pour moi. Merci.

3voto

FrostyFire Points 3083

Ce site est une très bonne source d'information, qui reprend toutes les questions que vous vous posez.

Voici un petit exemple de code tiré du lien ci-dessus :

Process[] collectionOfProcess = Process.GetProcessesByName("AcroRd32");
            if (collectionOfProcess.Length >= 1)
            {
                Process acrProcess = collectionOfProcess[0];

                MessageBox.Show(acrProcess.MainWindowTitle);// file name of the which is opened.

                MessageBox.Show("Acrobet reader running");
            }

De plus, il m'est arrivé qu'un programme ne puisse pas détecter ou "travailler" avec un processus qui lui est supérieur en termes de permissions. Assurez-vous que le lecteur Adobe n'est pas exécuté sous des privilèges d'administrateur, et s'il l'est, assurez-vous que votre programme l'est aussi.

J'espère que cela vous aidera !

0voto

adrianbanks Points 36858

Si vous passez le chemin d'accès du fichier PDF que vous venez de créer à l'adresse suivante Process.Start au lieu d'essayer de lancer Acrobat Reader, Windows ouvrira le PDF avec l'application par défaut associée à l'ordinateur. .pdf extension de fichier. Vous n'aurez même pas besoin de savoir quel lecteur ils ont installé. Si aucun lecteur n'est installé, Windows invitera l'utilisateur à choisir une application pour l'ouvrir. Cette option est préférable au lancement direct d'Acrobat Reader, car elle permet d'ouvrir le fichier PDF avec le lecteur préféré de l'utilisateur.

Si c'est ce que vous faites déjà (ce que je soupçonne d'après la question), alors vous obtenez très probablement l'exception IO parce que le fichier PDF généré est toujours ouvert dans PDFSharp ou votre code (c'est-à-dire que quelque chose le verrouille), ce qui signifie qu'Acrobat Reader ne peut pas l'ouvrir. Le démarrage d'un processus qui est déjà en cours d'exécution ne devrait pas provoquer cette erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X