VB 2010: Gérer les "ouvrir avec"

Résolu
Bonjour,

Je développe une application vb 2010.
Mon programme comporte une textbox.
Je voudrais que, lorsque l'on clique droit sur un fichier, ouvrir avec et que l'on choisisse mon executable, l'appli lise le fichier et l'affiche dans la textbox.
Pour le moment, cette opération ouvre juste mon application, mais aucun texte dans la textbox

Merci de votre aide.

12 réponses

  1. Contributeur
    Bonjour,

    Je te conseillerais de mettre une action dans le menu contextuel des fichiers texte qui ouvrirait ton appli avec l'affichage du fichier texte.
    Pour ce faire dans les 2 cas, il faut que tu récupères le chemin de ton fichier texte pour pouvoir l'afficher dans une TextBox ou une RichTexBox au choix suivant l'importance du fichier.
    0
    1. Bonjour, merci de ta réponse.

      Je voudrais cependant que cela se fasse avec tous les types de fichiers, pas seulement avec les fichiers textes. Pour ce qui est de modifier le menu contextuel, je vais faire plus de recherches de mon côté.
      0
      1. Contributeur
        Le fait de mettre le menu contextuel sur tous les fichiers n'est pas un problème. Le problème se situe de l'ouverture de ces fichiers qui est différente pour chaque extension. Pour le menu contextuel tu peux voir la marche à suivre dans différents de mes programmes. Par exemple un de mes derniers : "Visionneuse image" qui lui met un menu contextuel pour les dossier images.
        0
      2. Bonjour, le code de mon programme pour le bouton ouvrir est

        Try
        RichTextBox1.Rtf = fichier
        Catch ex As Exception
        RichTextBox1.Text = fichier
        End Try


        Je voudrais que mon programme s'ouvre et exécute le même code dès l'ouverture (en remplaçant fichier par l'adresse du fichier) - sans que l'on n'appuie sur le bouton ouvrir - lorsque l'on choisit d'ouvrir un fichier avec mon programme.

        Merci de votre aide et désolé si je n'avais pas bien exposé mon problème.
        0
        1. Contributeur
          Ouvrir un nouveau projet nommé: Lire_texte (c'est important pour la suite)
          mettre dans le Form une RichTextBox et un Button avec ce code:

          Option Strict On
          Imports System.IO
          Imports System.Text
          Imports Microsoft.Win32
          Public Class Form1
              Dim cheminsource As String 'chemin du fichier texte
              Dim Key As RegistryKey
              Dim cle_txt As String 'clé associée à l'extension .txt
             Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
                  Button1.Text = "Créer menu contextuel"
                  Verificationcletxt() 'Verifier si la clé Ouvrir Fichier texte existe
                  'ouverture par clic droit
                  'recuperer le chemin du fichier texte
                  For Each s As String In My.Application.CommandLineArgs
                      cheminsource = s 'chemin du fichier texte
                  Next s
                  If cheminsource = "" Then
                      Exit Sub
                  Else
                      liretexte(cheminsource) 'ouvrir le fichier texte dans une RichTextBox
                  End If
              End Sub
              'Verifier si la clé Ouvrir Fichier texte existe
              Private Sub Verificationcletxt()
                  cle_txt = rechercher_cle(".txt") 'chemin de la clé Ouvrir Fichier texte
                  Dim test As Microsoft.Win32.RegistryKey = My.Computer.Registry.ClassesRoot.OpenSubKey(cle_txt & "\shell\Ouvrir Fichier texte\command", False)
                  If test Is Nothing Then
                      Button1.Text = "Créer menu contextuel"
                  Else
                      Button1.Text = "Supprimer menu contextuel"
                  End If
              End Sub
              'création et suppression du menu contextuel Ouvrir Fichier texte
              Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
                  cle_txt = rechercher_cle(".txt") 'chemin clé
                  If Not IsAdmin() Then
                      MessageBox.Show("La modification du menu contextuel de l'explorateur ne se fera pas car vous n'avez pas les " & _
                           "droits d'aministrateur." & Environment.NewLine & "Pour modifier cette option, vous devez fermer ce programme " & _
                          " et le relancer en tant qu'administrateur.", "Droits d'aministrateur", MessageBoxButtons.OK, MessageBoxIcon.Information)
                  Else
                      If Button1.Text = "Créer menu contextuel" Then
                          'On crée la clé Ouvrir Fichier texte
                          Key = Registry.ClassesRoot.CreateSubKey(cle_txt & "\shell\Ouvrir Fichier texte\command") 'adapter le nom du menu contextuel
                          Registry.SetValue("HKEY_CLASSES_ROOT\" & cle_txt & "\shell\Ouvrir Fichier texte\command", "", My.Application.Info.DirectoryPath & "\" & "Lire_texte.exe " & """%1""") 'adapter le nom de l'appli
                          MessageBox.Show("Votre clé est créée", "Création clé registre", MessageBoxButtons.OK, MessageBoxIcon.Information)
                          Button1.Text = "Supprimer menu contextuel"
                      Else
                          Button1.Text = "Supprimer menu contextuel"
                          'On supprime la clé Ouvrir Fichier texte
                          Key = Registry.ClassesRoot.OpenSubKey(cle_txt & "\shell", True)
                          Key.DeleteSubKeyTree("Ouvrir Fichier texte") 'adapter le nom du menu contextuel
                          MessageBox.Show("Votre clé est supprimée", "Suppression clé registre", MessageBoxButtons.OK, MessageBoxIcon.Information)
                          Button1.Text = "Créer menu contextuel"
                      End If
                  End If
              End Sub
              'affiche le fichier texte dans une RichTextBox
              Private Sub liretexte(ByVal chemin As String)
                  Dim fileReader As String
                  fileReader = My.Computer.FileSystem.ReadAllText(chemin, Encoding.Default)
                  RichTextBox1.Text = fileReader
              End Sub
              Private Function IsAdmin() As Boolean
                  Return My.User.IsInRole(Microsoft.VisualBasic.ApplicationServices.BuiltInRole.Administrator)
              End Function
              'on recherche la clé associée à l'extension
              Public Function rechercher_cle(ByVal extension As String) As String
                  ' va chercher la sous-clé correspondante 
                  Key = Registry.ClassesRoot.OpenSubKey(extension)
                  extension = CStr(Key.GetValue(""))
                  Return extension
              End Function
          End Class
          


          Il faut que tu comprennes qu'en faisant un menu contextuel, c'est pour récupérer le chemin du fichier. A partir de là tu peux utiliser ce chemin pour faire ce que tu veux.

          Bonne programmation
          0
          1. Bonjour,

            Je tiens à préciser même après avoir supprimer la clé, la richtextbox est automatiquement remplie du texte du fichier ouvert.
            Je ne sais pas si c'est normal, mais ça marche avec tous les fichiers, pas seulement avec les fichiers texte.

            Sinon, comment faire pour que ce code marche dans mon application de départ, en sachant que mon application est portable (sans installation) et que l'exécutable peut donc bouger?
            0
            1. Contributeur
              Je voudrais que, lorsque l'on clique droit sur un fichier, ouvrir avec et que l'on choisisse mon executable, l'appli lise le fichier et l'affiche dans la textbox.

              Si tu ouvres ton application comme tu voulais le faire au départ, tu n'as que ce code à mettre:

              Option Strict On
              Imports System.IO
              Imports System.Text
              Public Class Form1
                  Dim cheminsource As String 'chemin du fichier texte
                    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
                             'recuperer le chemin du fichier texte
                      For Each s As String In My.Application.CommandLineArgs
                          cheminsource = s 'chemin du fichier texte
                      Next s
                      If cheminsource = "" Then
                          Exit Sub
                      Else
                          liretexte(cheminsource) 'ouvrir le fichier texte dans une RichTextBox
                      End If
                  End Sub
               'affiche le fichier texte dans une RichTextBox
                  Private Sub liretexte(ByVal chemin As String)
                      Dim fileReader As String
                      fileReader = My.Computer.FileSystem.ReadAllText(chemin, Encoding.Default)
                      RichTextBox1.Text = fileReader
                  End Sub
              


              Je tiens à préciser même après avoir supprimer la clé, la richtextbox est automatiquement remplie du texte du fichier ouvert.
              Je ne sais pas si c'est normal, mais ça marche avec tous les fichiers, pas seulement avec les fichiers texte.


              C'est normal. Je ne sais pas si tu as compris que l'action ce fait à l'ouverture de ton appli:

                 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
              


              Le menu contextuel c'est une facilité. Car avec ton clic droit pour choisir ton exécutable , tu obliges l'utilisateur à aller le chercher, mais c'est ton choix.

              J'espère que cela est plus clair pour toi. Il y a tous les commentaires pour la compréhension.

              0
              1. Bonjour,

                Merci beaucoup, ça marche.

                Je met le sujet en résolu.

                PS: est-ce obligé de mettre l'option strict à ON? Ça me crée des erreurs au niveau de mes msgbox.
                0
                1. Contributeur
                  l' Option Strict On te souligne toutes tes erreurs pour les corriger. Avant VB.NET on mettait :

                  MsgBox ("Bonjour")

                  Maintenant il faut mettre:

                  le corps du message: Bonjour
                  le titre du message: Salutation
                  L'icone à afficher: Information

                  Derrière MessageBoxIcon tu mets un point, tu va avoir un menu contextuel qui va s'afficher avec toutes les icones que tu peux mettre.
                  Ceci est valable pour tous ce qui a un point c'est très parique, il faut l'utiliser.

                   MessageBox.Show("Bonjour", "Salutations", MessageBoxButtons.OK, MessageBoxIcon.Information)
                              


                  Apprends à mettre tes MsgBox comme ceci. sauf quand tu veux faire des test bien entendu!

                  Bonne programmation
                  0
                  1. Bonjour,

                    Personellement je préfère utiliser
                    MsgBox("message", MsgBoxStyle.Information + vbOkOnly, "titre")

                    que
                    MessageBox.Show("Bonjour", "Salutations", MessageBoxButtons.OK, MessageBoxIcon.Information)


                    Sinon, l'erreur était que l'option strict on obligeait à remplacer
                    MsgBoxStyle.Information + vbOkOnly

                    par
                    CType(MsgBoxStyle.Information + vbOkOnly, MsgBoxSyle)


                    Embêtant mais facile à régler.
                    0
                    1. Contributeur
                      Mais ce n'est pas ce que tu préfères. C'est la manière de coder en VB.NET. Après bien sur tu fais ce que tu veux, mais généralement quand on fait un travail on essaie d'appliquer les règles.
                      Mais si tu ne veux pas être embêté tu mets:
                      Option Strict Off

                      parce que si un programmeur a réglé son VisualStudio 2010 automatiquement à l'ouverture en Option Strict On (c'est mon cas) , je ne t'explique pas les erreurs qu'il va trouvé.

                      Et pour les déclarations des variable numériques tel que:
                      Integer, Decimal, Double, Long etc., cela te corrige tes erreurs.

                      T'apprécies à l'usage. C'est juste une discipline a avoir comme dans beaucoup de domaine
                      0