tag:crieit.net,2005:https://crieit.net/tags/WSH/feed
「WSH」の記事 - Crieit
Crieitでタグ「WSH」に投稿された最近の記事
2019-08-27T11:22:49+09:00
https://crieit.net/tags/WSH/feed
tag:crieit.net,2005:PublicArticle/15355
2019-08-27T11:22:49+09:00
2019-08-27T11:22:49+09:00
https://crieit.net/posts/C-WSH
【C#】WSHを使ってショートカットを作成する
<p>今回はC#プログラムからWSHを利用して<br />
デスクトップにショートカットファイルを作成してみました。</p>
<p>プログラムは、新規作成となります。</p>
<h2 id="新規プロジェクトの作成"><a href="#%E6%96%B0%E8%A6%8F%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">新規プロジェクトの作成</a></h2>
<p>VisualStudio2017 で、新規コンソールプロジェクトを作成します。</p>
<p>VisualStudio2017のインストールやプロジェクトの作成方法は次の記事を参考にしていただければ。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/05/02/post-453/" target="_blank" rel="noopener" data-blogcard="1">Visual Studio 2017 Community のインストールから Hello World</a></p>
<h2 id="プログラム"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0">プログラム</a></h2>
<p>program.cs</p>
<pre><code>using System;
using System.IO;
using System.Reflection;
namespace ConsoleApp1
{
/// <summary>
/// コンソールプログラム.
/// </summary>
class Program
{
/// <summary>
/// メイン処理
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.WriteLine("ショートカット作成 開始");
// 引数にパスが設定されていたらそれを使う
string target = "";
foreach (string s in args)
{
FileInfo fi = new FileInfo(s);
if (fi.Exists)
{
target = fi.FullName;
// ショートカット作成
CreateShrotcutFile(target);
}
}
// 引数が無ければ、とりあえず自身のショートカットでも作ってみる
if (string.IsNullOrEmpty(target))
{
target = Assembly.GetExecutingAssembly().Location;
// ショートカット作成
CreateShrotcutFile(target);
}
Console.WriteLine("ショートカット作成 終了");
Console.ReadKey();
}
/// <summary>
/// ショートカットファイルを作成します.
/// </summary>
/// <param name="filePath"></param>
public static void CreateShrotcutFile(string filePath)
{
Console.WriteLine(new FileInfo(filePath).Name + " のショートカットを作成します。");
// 出力先(デスクトップ)
string destDir = Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory);
// ショートカットファイル名
string shortcutFile = Path.GetFileNameWithoutExtension(filePath) + @".lnk";
// 作成するショートカットのパス
string shortcutPath = destDir + @"\" + shortcutFile;
// リフレクションでWSHオブジェクトを作成
// GUIDは WSH のCLSID
dynamic shell = Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")));
// WSHでショートカットを作成
var shortcut = shell.CreateShortcut(shortcutPath);
// ショートカットのリンク先設定
shortcut.TargetPath = filePath;
// アイコンのパスを設定
// ショートカットの元となるファイルから 0番目 のアイコンを指定
shortcut.IconLocation = filePath + ",0";
// ショートカットを保存
shortcut.Save();
// Shell、COMオブジェクトの解放
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shortcut);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shell);
}
}
}
</code></pre>
<h2 id="CLSIDについて"><a href="#CLSID%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">CLSIDについて</a></h2>
<p>WSHのCLSIDなんかは、レジストリの<br />
「コンピュータ\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\」<br />
を参照してください。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2018/05/CSharpShortcut000.jpg" alt="レジストリエディタ" /></p>
<h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2>
<p>とりあえず、デバッグ引数に、「notepad.exe」、「explore.exe」のパスを渡して実行。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2018/05/CSharpShortcut001.jpg" alt="コンソール" /></p>
<p>コンソールに結果が出力され、デスクトップにショートカットが作成されればOKですね。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2018/05/CSharpShortcut002.jpg" alt="デスクトップ" /></p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>まあ、ちょっと使い道についてはなんとも言えませんが<br />
こういった方法があるんだということで、勉強になりました。</p>
<p>C#については次回は未定です。</p>
<p>ではでは。</p>
doraxdora