Per Visual C# Verknüpfung auf Windows 8 Kachelstartseite erstellen
-
Montag, 21. Januar 2013 11:31
Hallo ihr Lieben,
der Titel beschreibt das ganze eigentlich schon:
Wie kann ich mit Hilfe einer Programmiersprache, bspw. Java oder Visual C# eine Verknüpfung als Kachel auf der Windows-8-Startseite erstellen?
In diesem Fall soll keine Windows Store App realisiert werden, sondern einfach nur ein Verknüpfung erstellt werden, die dann auf der Kachelstartseite angepinnt wird.
Für alle hilfreichen und nett gemeinten Beiträge bin ich sehr dankbar und werde die entsprechenden Links und Buttons auch anwählen.
Vielen Dank!
Alle Antworten
-
Montag, 21. Januar 2013 19:42Moderator
Hallo trdsolutions,
Wenn ich deine Anforderungen richtig interpretiere, geht es um folgende zwei Schritte:
- Shortcut-Datei zu einer beliebigen Anwendung erstellen (keine App)
- Shortcut-Datei an "Start" anheften
Der erste Schritt ist relativ trivial zu implementieren. Und der zweite Schritt ist auch nicht schwierig: Aus der Auflistung aller in der Shell verfügbaren Verben zum erstellten Link, pickt man sich das Verb mit dem vielversprechenden Namen An Start anheften heraus. Und führt dann die dazugehörende Aktion aus. Das ist fast so, als würde der Benutzer mit der rechten Maustaste auf die LNK-Datei klicken und aus dem Kontextmenü "An Start anheften" auswählen.
Nachfolgende Beispiel-Anwendung heftet notepad.exe unter dem Namen "Mein Editor" an die Startseite an. Da im Code so manches ausgeführt wird, das unbedingt erhöhte Rechte benötigt, muss im Anwendungsmanifest natürlich requireAdministrator stehen. Ich brauche - hoffe ich - nicht zu unterstreichen, dass es sich hierbei lediglich um ein Konzept handelt. Vorsicht in der Produktion.
using System; using System.IO; using System.Text; using System.Threading; using IWshRuntimeLibrary; // Referenz hinzufügen > COM > Windows Script Host Object Model // Diese Anwendung muss mit erhöhten Rechten ausgeführt werden. // Deshalb muss im app.manifest requestedExecutionLevel auf // "requireAdministrator" gesetzt werden. namespace NotepadAnStartAnheften { class Program { [System.Runtime.InteropServices.DllImport("Shell32.dll")] private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2); static void Main(string[] args) { var lnkFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Mein Editor.lnk"); var notepadFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "notepad.exe"); PinToStart(notepadFilePath, "Mein Editor", lnkFilePath); Console.WriteLine("\nProgrammausführung mit beliebiger Taste beenden."); Console.ReadKey(true); } static void PinToStart(string targetExecutableFilePath, string targetExecutableDescription, string lnkFilePath) { var linkFileInStartMenuPrograms = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs), Path.GetFileName(lnkFilePath)); try { // Pfade ermitteln var shell = new WshShell(); // Alte Link-Datei entfernen aus ProgramFiles & Programs bool shouldNotify = false; if (System.IO.File.Exists(lnkFilePath)) { System.IO.File.Delete(lnkFilePath); shouldNotify = true; } if (System.IO.File.Exists(linkFileInStartMenuPrograms)) { System.IO.File.Delete(linkFileInStartMenuPrograms); shouldNotify = true; } if (shouldNotify) { SHChangeNotify(0x8000000, 0x0000, IntPtr.Zero, IntPtr.Zero); shouldNotify = false; } // Shortcut unter SpecialFolder.ProgramFiles speichern var shortcut = (IWshShortcut)shell.CreateShortcut(lnkFilePath); shortcut.TargetPath = targetExecutableFilePath; shortcut.WorkingDirectory = Path.GetDirectoryName(targetExecutableFilePath); shortcut.Description = targetExecutableDescription; shortcut.Save(); // An "Start" anheften Type shellApplicationType = System.Type.GetTypeFromProgID("Shell.Application"); dynamic shellApplication = Activator.CreateInstance(shellApplicationType); if (shellApplication != null) { var lnkDirectoryName = Path.GetDirectoryName(lnkFilePath); dynamic folder = shellApplication.NameSpace(lnkDirectoryName); if (folder != null) { var lnkFileName = Path.GetFileName(lnkFilePath); dynamic link = folder.ParseName(lnkFileName); if (link != null) { foreach (dynamic verb in link.Verbs) { if (verb.Name == "&An \"Start\" anheften") // engl. "&Pin to Start" { Console.WriteLine("Notepad wird an Start angeheftet..."); verb.DoIt(); shouldNotify = true; break; } else { Console.WriteLine(verb.Name); } } } } } // Desktop aktualisieren if (shouldNotify) SHChangeNotify(0x8000000, 0x0000, IntPtr.Zero, IntPtr.Zero); } catch (Exception ex) { Console.WriteLine("\n{0}", ex); } } } }Gruß
Marcel- Als Antwort markiert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Mittwoch, 30. Januar 2013 13:22
-
Dienstag, 22. Januar 2013 10:43Besitzer
Hallo trdsolutions,
Vielleicht auch noch interessant für Dich:
Create a Shutdown/Restart/Logoff Windows 8 Tile for the Start menu (PowerShell)
Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Mittwoch, 30. Januar 2013 13:23Besitzer
Hallo trdsolutions,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

