none
Per Visual C# Verknüpfung auf Windows 8 Kachelstartseite erstellen

    Frage

  • 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!

    Montag, 21. Januar 2013 11:31

Antworten

  • 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

    Montag, 21. Januar 2013 19:42
    Moderator

Alle Antworten

  • 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

    Montag, 21. Januar 2013 19:42
    Moderator
  • 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,
    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:23
    Besitzer