Entwickler-Ecke

Sonstiges (.NET) - Datei mittels eigenem Programm öffnen


Namenlosnameless - Di 04.01.11 14:48
Titel: Datei mittels eigenem Programm öffnen
Hallo

Ich will in meinen Sudoku Creator [http://www.c-sharp-forum.de/viewtopic.php?t=103364] eine neue Funktion einbauen!

Das Programm kann Datein speichern und laden und benutz dafür *.sud - Datein. Ich würde gerne, mein Programm als Standartprogramm für diese *.sud Datein festlegen und auch das abgespeicherte Sudoku sofort sehen, sobald die Datei aufgerufen wird.

1.Frage: Muss ich mein Programm erst installieren, bevor ich es als Standartprogramm verwenden kann

2.Frage: Wie kann ich beim starten des Programmes prüfen, ob das Programm über einen Klick auf eine *.sud-Datei aufgerufen wurde, und diese dann mittels meinem Code für das laden von Datein anzeigen?


mfg Christoph


Moderiert von user profile iconKha: Topic aus C# - Die Sprache verschoben am Di 04.01.2011 um 14:18


Th69 - Di 04.01.11 17:34

Für das Registrieren als Standardprogramm für ".sud"-Dateien, must du in die Registry schreiben (also installieren, da dafür Adminrechte benötigt werden).
Schau einfach mal mittels "regedit", wie das für andere Programme aussieht (unter HKEY_CLASSES_ROOT).

Und für das Abfangen in deinem Programm einfach den ersten Parameter auswerten (s.a. Programm mit Variable starten [http://www.c-sharp-forum.de/viewtopic.php?t=103365])
Dort steht dann der komplette Pfadname zu deiner ".sud"-Datei drin.


Namenlosnameless - Di 04.01.11 21:27

Danke fürs erste :zustimm:

okay das öffnen funktioniert!

Allerdings hab ich keinen Schimmer wie der Reg-Eintrag aussehen muss, damit das auch funktioniert! (Momentan hab ichs manuell eingestellt)
kannst du mir vlt ein bisschen genauere auskunft darüber geben, wie der Registryeintrag aussehen muss?

mfg Christoph


Th69 - Mi 05.01.11 13:11

Hallo Christoph,

für Delphi hab ich hier im Entwickler-Forum Code dafür gefunden: http://www.delphi-forum.de/topic_Dateityp+registrieren_96736,0.html (müßtest halt die passenden Registry-Methoden von .NET dir raussuchen -).
Unter http://dotnet-snippets.de/dns/clickonce-datei-verknuepfung-SID1212.aspx habe ich zumindestens schon mal C#-Code dafür gefunden. Müßte dann in etwa so aussehen

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
string sExt = ".sud"// Edit: weiß auch nicht, wie ich auf "suo" gekommen war (wahrscheinlich VS geschädigt -)
string sExtfile = "sudfile";
string sFileType = "Textdatei";
string sPath = Application.ExecutablePath; 

RegistryKey FileKey = Registry.ClassesRoot.CreateSubKey(sExt);
FileKey.SetValue("", sExtfile);

RegistryKey AppKey = Registry.ClassesRoot.CreateSubKey(sExtfile);
AppKey.SetValue("", sFileType);
AppKey.CreateSubKey(@"DefaultIcon").SetValue("", sPath);
AppKey.CreateSubKey(@"Shell\Open\Command").SetValue("", sPath + " %1");

(alles "Ohne (Schieß-)Gewehr" ;-) )

Und unter http://entwickler-forum.de/showthread.php?t=13726 noch eine kurze Beschreibung der nötigen Keys ('\Shell\Open\Command' ist dann der wichtige Eintrag).

Schau dir am besten mal mittels "Regedit" am Beispiel von ".txt"-Dateien das an:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
// mittels Export erzeugt
[HKEY_CLASSES_ROOT\.txt]
@="txtfile"
"PerceivedType"="text"
"Content Type"="text/plain"

[HKEY_CLASSES_ROOT\txtfile]
@="Textdatei"

[HKEY_CLASSES_ROOT\txtfile\shell]

[HKEY_CLASSES_ROOT\txtfile\shell\open]

[HKEY_CLASSES_ROOT\txtfile\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
  54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,25,00,31,00,00,\
  00 // entspricht "%SystemRoot%\system32\NOTEPAD.EXE %1"

(für dich unwichtige Keys habe ich weggelassen - auch "PerceivedType" und "Content Type" kannst du eigentlich weglassen, schaden aber auch nicht ;-)

Alternativ kannst du auch einfach bei dir die ".suo"-Datei mit deinem Programm verknüpfen (per Windows-Explorer) und dir dann die "RegEdit"-Einträge für ".suo" und "suofile" anschauen.

Viel Erfolg!


Namenlosnameless - Mi 05.01.11 21:17

Uff...

Habs wohl verabsäumt mich mit der Registry vertraut zu machen.

Ich versteh da wohl absolut nur Bahnhof, und werds fürs erste mal sein lassen, aber es hat keinen Sinn wenn ich versuche etwas zu machen, von dem ich absolut nix versteh!
vielen Dank für die Bemühungen


Trashkid2000 - Mi 05.01.11 21:54

Den Code, den user profile iconTh69 gepostet hat, funktioniert jedenfalls ohne Probleme. Jedenfalls auf einem WinXP 32 Bit, wie es mit anderen Systemen bzw. Architekturen aussieht, k.A.. Aber war die Dateiendung von Deinen Dateien nicht ".sud"? Das müsstest Du dann noch ändern. Wenn allerdings Dein Programm ein mehr oder weniger "portables App" sein soll (also es kann überall hin entpackt werden, ohne installiert zu werden), dann müsstest Du ja (sogar bei jedem Programmstart) prüfen, ob der Pfad noch aktuell ist, ansonsten den RegistryKey ändern. Und dann wäre die Verknüpfung auch erst ab dem 1. Programmstart verfügbar.
Und dann müsstest Du noch die Startparameter in Deinem Programm verarbeiten, also wenn einen Datei zum öffnen übergeben wurde, diese dann auch öffnen. Im Moment öffnet sich nur Dein Programm mit einem leeren Feld.
Marko


jaenicke - Mi 05.01.11 22:16

user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
dann müsstest Du ja (sogar bei jedem Programmstart) prüfen, ob der Pfad noch aktuell ist, ansonsten den RegistryKey ändern
Da das Programm kaum immer mit Adminrechten gestartet werden wird, wird das ohnehin nicht funktionieren.

Die Einrichtung dieser Registryeinträge gehört in das Setup.


Namenlosnameless - Mi 05.01.11 23:41

aber wie schauts aus, wenn ich es mit einem Manifest starten lasse, das Adminrechte vergibt?


jaenicke - Do 06.01.11 00:20

Wer ist schon so blöd und gibt einfach jedem Programm immer einfach Adminrechte? :roll:

Aber selbst wenn: Es nervt doch tierisch, wenn ich die bei jedem Start bestätigen muss.

Wenn, dann können die bei Bedarf angefordert werden. Aber wie gesagt: Sowas gehört in ein Setup.