Windows Script Host(WSH)を使用して簡単にショートカットを作成することができます。それには、まず「Windows Script Host Object Model」(wshom.ocx)を参照設定に追加します。参照設定に追加する方法は、「「○○○.dllを参照に追加します」の意味は?」をご覧ください。Windows Script Host Object Modelは、「参照の追加」ダイアログのCOMタブにあります。
WSHのWshShortcutオブジェクトを使用してショートカットを作成するコードは、以下のようなものです。ここでは、実行しているアプリケーションのショートカットをデスクトップに作成しています。この例では様々なオプションを設定していますが、デフォルトでよければ、ほとんどのオプションは設定する必要がありません。
'作成するショートカットのパス Dim shortcutPath As String = System.IO.Path.Combine( _ Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory), _ "MyApp.lnk") 'ショートカットのリンク先 Dim targetPath As String = Application.ExecutablePath 'WshShellを作成 Dim shell As New IWshRuntimeLibrary.WshShell() 'ショートカットのパスを指定して、WshShortcutを作成 Dim shortcut As IWshRuntimeLibrary.IWshShortcut = _ DirectCast(shell.CreateShortcut(shortcutPath), _ IWshRuntimeLibrary.IWshShortcut) 'リンク先 shortcut.TargetPath = targetPath 'コマンドパラメータ 「リンク先」の後ろに付く shortcut.Arguments = "/a /b /c" '作業フォルダ shortcut.WorkingDirectory = Application.StartupPath 'ショートカットキー(ホットキー) shortcut.Hotkey = "Ctrl+Alt+Shift+F12" '実行時の大きさ 1が通常、3が最大化、7が最小化 shortcut.WindowStyle = 1 'コメント shortcut.Description = "テストのアプリケーション" 'アイコンのパス 自分のEXEファイルのインデックス0のアイコン shortcut.IconLocation = Application.ExecutablePath + ",0" 'ショートカットを作成 shortcut.Save() '後始末 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shortcut) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shell)
//作成するショートカットのパス string shortcutPath = System.IO.Path.Combine( Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory), @"MyApp.lnk"); //ショートカットのリンク先 string targetPath = Application.ExecutablePath; //WshShellを作成 IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell(); //ショートカットのパスを指定して、WshShortcutを作成 IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(shortcutPath); //リンク先 shortcut.TargetPath = targetPath; //コマンドパラメータ 「リンク先」の後ろに付く shortcut.Arguments = "/a /b /c"; //作業フォルダ shortcut.WorkingDirectory = Application.StartupPath; //ショートカットキー(ホットキー) shortcut.Hotkey = "Ctrl+Alt+Shift+F12"; //実行時の大きさ 1が通常、3が最大化、7が最小化 shortcut.WindowStyle = 1; //コメント shortcut.Description = "テストのアプリケーション"; //アイコンのパス 自分のEXEファイルのインデックス0のアイコン shortcut.IconLocation = Application.ExecutablePath + ",0"; //ショートカットを作成 shortcut.Save(); //後始末 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shortcut); System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shell);
補足:以前は上記のコードで、「WshShell」を「WshShellClass」としていました。しかし.NET Framework 4.0からは、「WshShellClass」では「相互運用型 'IWshRuntimeLibrary.WshShellClass' を埋め込むことができません。代わりに適用可能なインターフェイスを使用してください。」というエラーが出るようになりました。この対策は「c# - Interop type cannot be embedded」などにあり、上記のように「Class」を取り除く方法の他に、ソリューションエクスプローラーの「参照設定」で「IWshRuntimeLibrary」を選択し、プロパティの「相互運用機能型の埋め込み」をFalseにする方法があります。
この方法で作成できるショートカットはファイルだけで、フォルダのショートカットは作成できないようです。
リフレクションを使って動的にWshShellを作成すれば、「Windows Script Host Object Model」を参照設定に追加しなくても、ショートカットを作成することができるようになります。
この方法でショートカットを作成する例を以下に示します。なおリフレクションについて詳しくは「型のメンバを動的に呼び出す」で説明していますのでそちらをご覧ください。
'作成するショートカットのパス Dim shortcutPath As String = System.IO.Path.Combine( _ Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory), _ "MyApp.lnk") 'ショートカットのリンク先 Dim targetPath As String = Application.ExecutablePath 'WshShellを作成 Dim t As Type = _ Type.GetTypeFromCLSID(New Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")) Dim shell As Object = Activator.CreateInstance(t) 'WshShortcutを作成 Dim shortcut As Object = t.InvokeMember("CreateShortcut", _ System.Reflection.BindingFlags.InvokeMethod, Nothing, shell, _ New Object() {shortcutPath}) 'リンク先 t.InvokeMember("TargetPath", _ System.Reflection.BindingFlags.SetProperty, Nothing, shortcut, _ New Object() {targetPath}) 'アイコンのパス t.InvokeMember("IconLocation", _ System.Reflection.BindingFlags.SetProperty, Nothing, shortcut, _ New Object() {Application.ExecutablePath + ",0"}) 'その他のプロパティも同様に設定できるため、省略 'ショートカットを作成 t.InvokeMember("Save", _ System.Reflection.BindingFlags.InvokeMethod, Nothing, shortcut, Nothing) '後始末 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shortcut) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shell)
//作成するショートカットのパス string shortcutPath = System.IO.Path.Combine( Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory), @"MyApp.lnk"); //ショートカットのリンク先 string targetPath = Application.ExecutablePath; //WshShellを作成 Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); object shell = Activator.CreateInstance(t); //WshShortcutを作成 object shortcut = t.InvokeMember("CreateShortcut", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { shortcutPath }); //リンク先 t.InvokeMember("TargetPath", System.Reflection.BindingFlags.SetProperty, null, shortcut, new object[] { targetPath }); //アイコンのパス t.InvokeMember("IconLocation", System.Reflection.BindingFlags.SetProperty, null, shortcut, new object[] { Application.ExecutablePath + ",0" }); //その他のプロパティも同様に設定できるため、省略 //ショートカットを作成 t.InvokeMember("Save", System.Reflection.BindingFlags.InvokeMethod, null, shortcut, null); //後始末 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shortcut); System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shell);
.NET Framework 4.0からはdynamic型を使用することで、コードをもっと簡単にできます。
'作成するショートカットのパス Dim shortcutPath As String = System.IO.Path.Combine( _ Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory), _ "MyApp.lnk") 'ショートカットのリンク先 Dim targetPath As String = Application.ExecutablePath 'WshShellを作成 Dim t As Type = _ Type.GetTypeFromCLSID(New Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")) Dim shell = Activator.CreateInstance(t) 'WshShortcutを作成 Dim shortcut = shell.CreateShortcut(shortcutPath) 'リンク先 shortcut.TargetPath = targetPath 'アイコンのパス shortcut.IconLocation = Application.ExecutablePath + ",0" 'その他のプロパティも同様に設定できるため、省略 'ショートカットを作成 shortcut.Save() '後始末 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shortcut) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shell)
//作成するショートカットのパス string shortcutPath = System.IO.Path.Combine( Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory), @"MyApp.lnk"); //ショートカットのリンク先 string targetPath = Application.ExecutablePath; //WshShellを作成 Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); dynamic shell = Activator.CreateInstance(t); //WshShortcutを作成 var shortcut = shell.CreateShortcut(shortcutPath); //リンク先 shortcut.TargetPath = targetPath; //アイコンのパス shortcut.IconLocation = Application.ExecutablePath + ",0"; //その他のプロパティも同様に設定できるため、省略 //ショートカットを作成 shortcut.Save(); //後始末 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shortcut); System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shell);
COM InteropでShellLinkを使用する方法が、「vbAccelerator - Creating and Modifying Shortcuts」で紹介されています。そこで公開されているShellLinkクラスを使用することで、ショートカットを簡単に作成できます。この方法はここでは紹介しませんので、リンク先をご覧ください。
URLショートカットもWindows Script Hostで作成できますが(WshShortcutの代わりにWshUrlShortcutオブジェクトを使います)、URLショートカットはテキストファイルのため、わざわざそうする必要もありません。
以下に、DOBON.NETへのリンク(https://dobon.net/index.html)をデスクトップに作成する例を示します。
'作成するURLショートカットのパス Dim shortcutPath As String = System.IO.Path.Combine( _ Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory), _ "DOBON.NET.url") 'ショートカットのリンク先 Dim targetUrl As String = "https://dobon.net/index.html" 'テキストファイルに書き込む Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis") Dim sw As New System.IO.StreamWriter(shortcutPath, False, enc) sw.WriteLine("[InternetShortcut]") sw.WriteLine("URL=" & targetUrl) sw.Close()
//作成するURLショートカットのパス string shortcutPath = System.IO.Path.Combine( Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory), @"DOBON.NET.url"); //ショートカットのリンク先 string targetUrl = "https://dobon.net/index.html"; //テキストファイルに書き込む System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); System.IO.StreamWriter sw = new System.IO.StreamWriter(shortcutPath, false, enc); sw.WriteLine("[InternetShortcut]"); sw.WriteLine("URL=" + targetUrl); sw.Close();
実はこの方法で実行ファイルへのショートカットを作成することもできます。ただしこの場合は、Webブラウザが実行ファイルを開きますので、「ファイルのダウンロード」ダイアログが表示され、「実行」ボタンを押さなければ実行されません。
以下に実行しているアプリケーションのURLショートカットをデスクトップに作成する例を示します。
Dim shortcutPath As String = System.IO.Path.Combine( _ Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory), _ "MyApp.url") 'ショートカットのリンク先 Dim targetPath As String = Application.ExecutablePath 'テキストファイルに書き込む Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis") Dim sw As New System.IO.StreamWriter(shortcutPath, False, enc) sw.WriteLine("[InternetShortcut]") sw.WriteLine("URL=file:///" & targetPath) 'アイコンを指定する sw.WriteLine("IconFile=" & targetPath) sw.WriteLine("IconIndex=0") sw.Close()
//作成するURLショートカットのパス string shortcutPath = System.IO.Path.Combine( Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory), @"MyApp.url"); //ショートカットのリンク先 string targetPath = Application.ExecutablePath; //テキストファイルに書き込む System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); System.IO.StreamWriter sw = new System.IO.StreamWriter(shortcutPath, false, enc); sw.WriteLine("[InternetShortcut]"); sw.WriteLine("URL=file:///" + targetPath); //アイコンを指定する sw.WriteLine("IconFile=" + targetPath); sw.WriteLine("IconIndex=0"); sw.Close();