Laden...

Datei -> Öffnen mit - Wie im Programm annehmen?

Erstellt von casbar vor 15 Jahren Letzter Beitrag vor 14 Jahren 2.861 Views
C
casbar Themenstarter:in
1 Beiträge seit 2008
vor 15 Jahren
Datei -> Öffnen mit - Wie im Programm annehmen?

Hallo!
Ich erzeuge mit einem c# Programm bestimmte Dateien.
Jetzt will ich, indem man auf die Datei klickt das sich das Programm startet, das krieg ich natürlich hin, nur wie nehme ich die Datei an? Bzw welche Parameter kriegt man dann?

Hoffe hier kann mir jemand helfen, ist nämlich wichtig!

Vielen Dank!!

casbar

10 Beiträge seit 2008
vor 15 Jahren

Wenn du der Dateierweiterung beispielsweise über die Registry einen Handler alá "MeinProgramm.exe %1" zuweist, dann wird der Dateiname samt Pfad dieser Datei als Parameter übergeben. Auslesen kannst du die Datei, indem du einfach den ein File.Open mit dem Parameter durchführst. Sollte das Programm nicht von selbst die Parameter einlesen, musst du die Main Methode überschreiben:


static void Main(string[] args)
{
        FileStream stream = File.Open(args[0]);
}

2.223 Beiträge seit 2005
vor 15 Jahren

Hallo casbar und Herzlich Wilkommen,

ja genau mit dem %1 in der registry bekommst du den Pfad mit samt dem namen der datei als parameter übergeben

der Pfad in der Registry wäre

HKEY_CLASSES_ROOT.[Extension]\Shell\Open\Command

als value dann natürlich den Pfad deiner Anwendung mitsamt %1 mit einem Leerzeichen

mfg

T
193 Beiträge seit 2006
vor 14 Jahren

hallo,

ich würde auch gerne auf eine datei doppelklicken und dann das programm starten, nur bekomme ich immer nur C:\Users\Username zurück und sonst nichts?? wo mache ich den fehler?? habe %1 in meiner reg stehen

hier die übergabe von der datei:


        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            //Application.Run(new frmMain());

            if (args.Length > 0)
            {
                Application.Run(new frmMain(args[0]));
            }
            else
            {
                Application.Run(new frmMain());
            }
                

        }




        public frmMain(string args)
        {
            InitializeComponent();
            InitializeSettings();
            LoadMenu();
            this.args = args;


            MessageBox.Show(args.ToString());
        }


danke,
torti

2.223 Beiträge seit 2005
vor 14 Jahren

Hallo Torti,

könntest Du auch mal einen auszug aus deiner Registry Posten

Viele grüße
Lars

T
193 Beiträge seit 2006
vor 14 Jahren

könntest Du auch mal einen auszug aus deiner Registry Posten

sicher!



                RegistryKey schluessel = Registry.ClassesRoot.CreateSubKey(".cdb");

                schluessel.SetValue("", "cdb_auto_file");

                schluessel = Registry.ClassesRoot.CreateSubKey("cdb_auto_file");
                using (RegistryKey shellEintrag = schluessel.CreateSubKey("shell"))
                {
                    using (RegistryKey open = shellEintrag.CreateSubKey("open"))
                    {
                        open.CreateSubKey("command");
                        using (RegistryKey commandOpen = open.CreateSubKey("command"))
                        {
                            commandOpen.SetValue("", @"E:\.....\Debug\....exe %1", RegistryValueKind.ExpandString);
                        }
                    }

                    using (RegistryKey print = shellEintrag.CreateSubKey("edit"))
                    {
                        print.CreateSubKey("command");
                        using (RegistryKey commandOpen = print.CreateSubKey("command"))
                        {
                            commandOpen.SetValue("", @"E:\.....\Debug\....exe %1", RegistryValueKind.ExpandString);
                        }
                    }

                }

                //Einfügen eines Icons
                using (RegistryKey iconEintrag = schluessel.CreateSubKey("DefaultIcon"))
                {
                    iconEintrag.SetValue("", @"E:\.....\Debug\....exe ,0");
                }

mache ich hier was falsch?? mit %1 müsste doch der dateiname übergeben werden. oder??? pfade für das programm, welche zur exe führen stimmen, da das programm erfolgreich gestartet wird.

danke,
torti

4.221 Beiträge seit 2005
vor 14 Jahren

Falsch:

  
                Application.Run(new frmMain(args[0]));  
  

Richtig:


                Application.Run(new frmMain(args[1]));

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

T
193 Beiträge seit 2006
vor 14 Jahren

das war exakt der fehler, danke!!!

torti

4.221 Beiträge seit 2005
vor 14 Jahren

Gemäss MSDN:

Das erste Element des Arrays enthält den Dateinamen des ausgeführten Programms. Wenn der Dateiname nicht verfügbar ist, ist das erste Element gleich String..::.Empty. Die restlichen Elemente enthalten die zusätzlich in der Befehlszeile eingegebenen Token.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Hinweis von herbivore vor 11 Jahren

Siehe auch [FAQ] mehrere Programminstanzen verhindern (inkl. Parameterübergabe)