web-dev-qa-db-ja.com

ディレクトリにアプリケーションのショートカットを作成する

C#または.NETフレームワークを使用して、アプリケーションショートカット(.lnkファイル)を作成するにはどうすればよいですか?

結果は、指定されたアプリケーションまたはURLへの.lnkファイルになります。

70
Chasler

それは私が気に入っていたほど単純ではありませんが、素晴らしいクラス呼び出しがあります ShellLink.cs at vbAccelerator

このコードは相互運用を使用しますが、WSHに依存しません。

このクラスを使用して、ショートカットを作成するコードは次のとおりです。

private static void configStep_addShortcutToStartupGroup()
{
    using (ShellLink shortcut = new ShellLink())
    {
        shortcut.Target = Application.ExecutablePath;
        shortcut.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
        shortcut.Description = "My Shorcut Name Here";
        shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
        shortcut.Save(STARTUP_SHORTCUT_FILEPATH);
    }
}
61
Chasler

素敵できれい。 (。NET 4.0

Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); //Windows Script Host Shell Object
dynamic Shell = Activator.CreateInstance(t);
try{
    var lnk = Shell.CreateShortcut("sc.lnk");
    try{
        lnk.TargetPath = @"C:\something";
        lnk.IconLocation = "Shell32.dll, 1";
        lnk.Save();
    }finally{
        Marshal.FinalReleaseComObject(lnk);
    }
}finally{
    Marshal.FinalReleaseComObject(Shell);
}

それだけです。追加のコードは必要ありません。 CreateShortcutはファイルからショートカットをロードすることもできるため、TargetPathなどのプロパティは既存の情報を返します。 ショートカットオブジェクトのプロパティ

動的型をサポートしない.NETのバージョンでも、この方法で可能です。 (。NET 3.5

Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); //Windows Script Host Shell Object
object Shell = Activator.CreateInstance(t);
try{
    object lnk = t.InvokeMember("CreateShortcut", BindingFlags.InvokeMethod, null, Shell, new object[]{"sc.lnk"});
    try{
        t.InvokeMember("TargetPath", BindingFlags.SetProperty, null, lnk, new object[]{@"C:\whatever"});
        t.InvokeMember("IconLocation", BindingFlags.SetProperty, null, lnk, new object[]{"Shell32.dll, 5"});
        t.InvokeMember("Save", BindingFlags.InvokeMethod, null, lnk, null);
    }finally{
        Marshal.FinalReleaseComObject(lnk);
    }
}finally{
    Marshal.FinalReleaseComObject(Shell);
}
49
IllidanS4

私はこのようなものを見つけました:

private void appShortcutToDesktop(string linkName)
{
    string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

    using (StreamWriter writer = new StreamWriter(deskDir + "\\" + linkName + ".url"))
    {
        string app = System.Reflection.Assembly.GetExecutingAssembly().Location;
        writer.WriteLine("[InternetShortcut]");
        writer.WriteLine("URL=file:///" + app);
        writer.WriteLine("IconIndex=0");
        string icon = app.Replace('\\', '/');
        writer.WriteLine("IconFile=" + icon);
        writer.Flush();
    }
}

sorrowmanの記事「url-link-to-desktop」 の元のコード

14
Anuraj

IllidanS4's answer と同様に、 Windows Script Host を使用することが、私にとって最も簡単なソリューションであることが証明されました(Windows 8 64ビットでテスト済み)。

ただし、コードを使用してCOMタイプを手動でインポートするよりも、COMタイプライブラリを参照として追加する方が簡単です。 References->Add Reference...COM->Type Librariesを選択し、「Windowsスクリプトホストオブジェクトモデル」を検索して追加します。

これにより、名前空間IWshRuntimeLibraryがインポートされ、そこからアクセスできます。

WshShell Shell = new WshShell();
IWshShortcut link = (IWshShortcut)Shell.CreateShortcut(LinkPathName);
link.TargetPath=TargetPathName;
link.Save();

クレジットはJim Hollenhorstに送られます

1
Steven Jeuris

Donwload IWshRuntimeLibrary

COMライブラリIWshRuntimeLibraryのインポートも必要です。プロジェクトを右クリック->参照を追加-> COM-> IWshRuntimeLibrary->追加し、次のコードスニペットを使用します。

private void createShortcutOnDesktop(String executablePath)
{
    // Create a new instance of WshShellClass

    WshShell lib = new WshShellClass();
    // Create the shortcut

    IWshRuntimeLibrary.IWshShortcut MyShortcut;


    // Choose the path for the shortcut
    string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    MyShortcut = (IWshRuntimeLibrary.IWshShortcut)lib.CreateShortcut(@deskDir+"\\AZ.lnk");


    // Where the shortcut should point to

    //MyShortcut.TargetPath = Application.ExecutablePath;
    MyShortcut.TargetPath = @executablePath;


    // Description for the shortcut

    MyShortcut.Description = "Launch AZ Client";

    StreamWriter writer = new StreamWriter(@"D:\AZ\logo.ico");
    Properties.Resources.system.Save(writer.BaseStream);
    writer.Flush();
    writer.Close();
    // Location for the shortcut's icon           

    MyShortcut.IconLocation = @"D:\AZ\logo.ico";


    // Create the shortcut at the given path

    MyShortcut.Save();

}
1
AZ_

すべての可能性を調査した後、SOで解決しました ShellLink

//Create new shortcut
using (var shellShortcut = new ShellShortcut(newShortcutPath)
{
     Path = path
     WorkingDirectory = workingDir,
     Arguments = args,
     IconPath = iconPath,
     IconIndex = iconIndex,
     Description = description,
})
{
    shellShortcut.Save();
}

//Read existing shortcut
using (var shellShortcut = new ShellShortcut(existingShortcut))
{
    path = shellShortcut.Path;
    args = shellShortcut.Arguments;
    workingDir = shellShortcut.WorkingDirectory;
    ...
}

単純で効果的であることに加えて、著者(MattiasSjögren、MS MVP)は、ある種のCOM/PInvoke/Interopの第一人者であり、彼のコードを熟読すると、他の方法よりも堅牢だと思います。

ショートカットファイルは、いくつかのコマンドラインユーティリティ(C#/。NETから簡単に呼び出すこともできます)によって作成することもできます。私はそれらのいずれも試したことはありませんが、 NirCmd (NirSoftにはSysInternalsのような品質のツールがあります)から始めます。

残念ながら、NirCmdはparseショートカットファイル(作成のみ)はできませんが、その目的のために TZWorks lp は機能しているようです。出力をcsvとしてフォーマットすることもできます。 lnk-parser も良さそうです(HTMLとCSVの両方を出力できます)。

1
Ohad Schneider