C#または.NETフレームワークを使用して、アプリケーションショートカット(.lnkファイル)を作成するにはどうすればよいですか?
結果は、指定されたアプリケーションまたはURLへの.lnkファイルになります。
それは私が気に入っていたほど単純ではありませんが、素晴らしいクラス呼び出しがあります 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);
}
}
素敵できれい。 (。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);
}
私はこのようなものを見つけました:
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();
}
}
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();
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();
}
すべての可能性を調査した後、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の両方を出力できます)。