2019-08-27に投稿

【C#】WSHを使ってショートカットを作成する

今回はC#プログラムからWSHを利用して
デスクトップにショートカットファイルを作成してみました。

プログラムは、新規作成となります。

新規プロジェクトの作成

VisualStudio2017 で、新規コンソールプロジェクトを作成します。

VisualStudio2017のインストールやプロジェクトの作成方法は次の記事を参考にしていただければ。

Visual Studio 2017 Community のインストールから Hello World

プログラム

program.cs

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);

        }

    }
}

CLSIDについて

WSHのCLSIDなんかは、レジストリの
「コンピュータ\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\」
を参照してください。

レジストリエディタ

起動してみる

とりあえず、デバッグ引数に、「notepad.exe」、「explore.exe」のパスを渡して実行。

コンソール

コンソールに結果が出力され、デスクトップにショートカットが作成されればOKですね。

デスクトップ

まとめ

まあ、ちょっと使い道についてはなんとも言えませんが
こういった方法があるんだということで、勉強になりました。

C#については次回は未定です。

ではでは。

Originally published at www.doraxdora.com

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント