DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ショートカットを作成する

Windows Script Hostを使用する

Windows Script Host(WSH)を使用して簡単にショートカットを作成することができます。それには、まず「Windows Script Host Object Model」(wshom.ocx)を参照設定に追加します。参照設定に追加する方法は、「「○○○.dllを参照に追加します」の意味は?」をご覧ください。Windows Script Host Object Modelは、「参照の追加」ダイアログのCOMタブにあります。

WSHのWshShortcutオブジェクトを使用してショートカットを作成するコードは、以下のようなものです。ここでは、実行しているアプリケーションのショートカットをデスクトップに作成しています。この例では様々なオプションを設定していますが、デフォルトでよければ、ほとんどのオプションは設定する必要がありません。

VB.NET
コードを隠すコードを選択
'作成するショートカットのパス 
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)
C#
コードを隠すコードを選択
//作成するショートカットのパス
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」を参照設定に追加しなくても、ショートカットを作成することができるようになります。

この方法でショートカットを作成する例を以下に示します。なおリフレクションについて詳しくは「型のメンバを動的に呼び出す」で説明していますのでそちらをご覧ください。

VB.NET
コードを隠すコードを選択
'作成するショートカットのパス
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)
C#
コードを隠すコードを選択
//作成するショートカットのパス
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型を使用することで、コードをもっと簡単にできます。

VB.NET
コードを隠すコードを選択
'作成するショートカットのパス
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)
C#
コードを隠すコードを選択
//作成するショートカットのパス
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ショートカットを作成する

URLショートカットもWindows Script Hostで作成できますが(WshShortcutの代わりにWshUrlShortcutオブジェクトを使います)、URLショートカットはテキストファイルのため、わざわざそうする必要もありません。

以下に、DOBON.NETへのリンクをデスクトップに作成する例を示します。

VB.NET
コードを隠すコードを選択
'作成する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()
C#
コードを隠すコードを選択
//作成する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ショートカットをデスクトップに作成する例を示します。

VB.NET
コードを隠すコードを選択
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()
C#
コードを隠すコードを選択
//作成する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();
  • 履歴:
  • 2013/7/6 「Windows Script Hostを使用する」で、.NET Framework 4.0からエラーが出る問題を修正し、対策を追記。(コメントでご報告頂きました。)
  • 2014/5/29 Windows Script Hostを使用した方法で、リフレクションを使用した方法を追加。Marshal.ReleaseComObjectをFinalReleaseComObjectに変更など。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。