Comment trouver le process d'une appli sans lancer le process ?

Résolu
papysaf Messages postés 3 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 16 février 2012 - 9 févr. 2012 à 20:41
lossehelin Messages postés 51 Date d'inscription jeudi 10 mai 2012 Statut Membre Dernière intervention 5 juillet 2012 - 22 mai 2012 à 11:07
Bonjour,
J'ai besoin de passer un paramètre avant le nom du fichier à ouvrir (AcrobatReader demande le N° de page avant le nom du PDF :
C:....acro.exe /A page=25 Fic.PDF)
Avec ProcessStartInfo, si le paramètre "A/ page=25" est passé avec Arguments, celui-ci est probablement mis après dans la ligne de commande sous-entendue. Le fichier PDF est ouvert mais à la page 1. En VB6 çà marche avec FindExecutable.
J'ai une solution qui fonctionne avec l'api Win32 importée dans une class. Mais je voudrais utiliser Process ou ProcessStartInfo en C#.
Merci de m'aider.

Papysaf

8 réponses

MichelLP Messages postés 1 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 9 février 2012
9 févr. 2012 à 20:55
Bonjour Papysaf
Je suppose que tu veux connaitre le nom et le chemin de l'exe du PDF.
En VB6 tu reconstrusais la ligne de commande et tu lançais un Shell ou ShellExecute C'est çà ???
Bye

MichelLP
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 févr. 2012 à 09:46
pouquoi ne pas utiliser FindExecutable, si cela fonctionne ?


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
3
NHenry Messages postés 15090 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 6 novembre 2023 159
13 févr. 2012 à 21:22
Bonjour,

Normalement, ça ne change pas en fonction de la version de Windows.

"qu'une instruction VB comme FindExecutable()"
FindExecutable, est une API Windows, pas une instruction du langage.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
3
NHenry Messages postés 15090 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 6 novembre 2023 159
9 févr. 2012 à 21:20
Bonjour,

En regardant dans le registre, tu peux avoir une réponse :
http://msdn.microsoft.com/en-us/library/windows/desktop/cc144154%28v=vs.85%29.aspx

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
papysaf Messages postés 3 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 16 février 2012
12 févr. 2012 à 10:56
Bjr
Merci à vous tous.
MichelLP a bien vu comment je procédais en VB6
NHenry, Je suis d'accord mais j'ai peur qu'en fonction des différent OS les clés n'aient pas le même nom où la même place dans le registre.
Refield, Celà m'oblige à m'adresser à Kernel32.dll qui pourrait bien ne plus suivre les nouveaux OS.

En fait pour une question d'homogénéïté je me dis qu'une instruction C# serait la plus adaptée. Et surtout je me dis qu'une instruction VB comme FindExecutable() doit forcément avoir une équivalence en C#. Bill Gates n'a pas pu régresser. Il doit exister une manière, un paramètre, ou même une autre instruction qui fait çà.


Papysaf
0
papysaf Messages postés 3 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 16 février 2012
16 févr. 2012 à 18:44
Merci à vous tous
Finalement j'ai validé l'importation de FindExecutable() des Api32
Merci encore

Papysaf
0
lossehelin Messages postés 51 Date d'inscription jeudi 10 mai 2012 Statut Membre Dernière intervention 5 juillet 2012
21 mai 2012 à 11:39
Bonjour,

Je suis désolé de remonter ce topic, mais je rencontre le problème suivant:

Dans mon stage de fin de DUT Informatique, une petite partie du projet consiste à imprimer une sélection de fichiers PDF.
Depuis mon code, j'ouvre donc AcroRd32.exe avec l'option /p pour utiliser l'interface d'impression d'Acrobat Reader.

Le problème est que pour l'instant, je n'ai trouvé d'autre moyen que de donner le chemin complet de l'exe, et la même version du Reader n'est pas installée sur tous les postes de l'entreprise, il faudrait donc que je puisse déterminer le chemin complet de l'exe par défaut (qui sera toujours une version d'Acrobat Reader, mais pas la même) pour le lancer avec l'option /p !

Je sais que dans ce topic, on parle de ce que je recherche, mais malheureusement, je ne comprends pas comment utiliser FindExecutable, n'ayant jamais fait de VB !

Voici un exemple de comment j'utilise monde code:
        static String cheminAcroRd32 = @"C:\Program Files\Adobe\Reader 10.0\Reader\AcroRd32.exe";
        static Int32 waitingTime = 10000;

        static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                Console.WriteLine("ERREUR - Usage: print [fichierPDF]");
            }
            else
            {
                try
                {
                    string filePath = args[0];
                    Process proc = new Process();
                    proc.StartInfo.FileName = cheminAcroRd32;
                    proc.StartInfo.Arguments = "/p " + filePath;
                    proc.Start();
                    if (proc.HasExited == false)
                    {
                        proc.WaitForExit(waitingTime);
                        proc.Kill();
                    }
                    proc.EnableRaisingEvents = true;
                    proc.CloseMainWindow();
                    proc.Close();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }


J'aimerai donc remplacer la ligne:
proc.StartInfo.FileName = cheminAcroRd32;

Par quelque chose du genre:
proc.StartInfo.FileName = getDefaultApplication(filepath);
0
lossehelin Messages postés 51 Date d'inscription jeudi 10 mai 2012 Statut Membre Dernière intervention 5 juillet 2012
22 mai 2012 à 11:07
Bon, bah j'ai fini par comprendre comment importer shell32.dll et utiliser la fonction FindExecutable :)
Voici le code, si quelqu'un se retrouve dans le même cas que moi:
        private static string findExecutable( string filepath )
        {
            StringBuilder objResultBuffer = new StringBuilder(1024);
            long lngResult = 0;

            lngResult = FindExecutableA( filepath, string.Empty, objResultBuffer );

            if (lngResult >= 32)
            {
                return objResultBuffer.ToString();
            }

            return string.Format( "Error: ({0})", lngResult );
        }

        [DllImport( "shell32.dll", EntryPoint = "FindExecutable" )]
        private static extern long FindExecutableA( string lpFile, string lpDirectory, StringBuilder lpResult );

La fonction FindExecutable prend en paramètre le chemin (relatif ou absolu) vers le fichier (doit exister réellement sur le disque), et renvoit le chemin absolu de l'application par défaut pour ouvrir ce fichier.
0
Rejoignez-nous