
Windows起動時にアプリを起動させたい場合、スタートアップメニューにアプリを登録することは良くあると思う。
でも、Windows 10や8.1などでは、スタートアップメニューへの登録方法が面倒というか分かりにくく、自作ソフトでもたまに問い合わせが来る。
インストーラでスタートアップに登録すれば確実なんだけど、フリーソフトでインストーラとかは嫌がられる場合も多く、作る手間も掛かる。
そんな訳で、アプリケーション側で、自分自身のショートカットをスタートアップメニューに登録する方法を調べてみた。
まずは、スタートメニューのフォルダを調べる方法。
// 特殊ディレクトリ(スタートアップ)のパスを取得する Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)
Stringの値が返される。
例)C:\Users\<ユーザ名>\AppData\Roaming\Microsoft\Windows\Start Menu
そして、アプリ自身のexeファイル名の取得方法。
Path.GetFileName(Application.ExecutablePath)
Stringの値が返される。
例)sampleApl.EXE
あとは、exeのショートカットをスタートメニューのフォルダにコピーするだけ。
・・・。
あれ、どうやらC#やVB.NETではファイルのショートカットを作る機能が無いっぽい。
そういえば、前も似たようなことをやった記憶が。。
そうだ、これだ。
[C#] 送るメニューにショートカットを登録/解除する方法
この時も、ショートカット作成に苦労した。
なので、ショートカットの作成は、上記記事の「方法4」を流用し、WSH(Windows Script Host)でショートカットを作成する。
いろいろ方法があるので、詳しくは上記記事を参照。

で、途中の説明は割愛し、最終的に出来上がったソースコードは以下の通り。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// 追加
using System.IO;
using System.Reflection;
using System.Diagnostics;
namespace sampleApl
{
public partial class Form1 : Form
{
private string aplTitle = null; // アプリ名
private string exeFile = null; // exeファイル名
private string jsFile = null; // スクリプトファイル名
private string lnkFile = null; // リンク名
private bool frmLoadFlg = false; // Form1ロード済みか
public Form1()
{
InitializeComponent();
}
/// <summary>
/// フォームロード時の初期化処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
// プロジェクト>プロパティ>アセンブリ情報 で指定した「タイトル」を取得
var assembly = Assembly.GetExecutingAssembly();
var attribute = Attribute.GetCustomAttribute(
assembly,
typeof(AssemblyTitleAttribute)
) as AssemblyTitleAttribute;
aplTitle = attribute.Title;
this.Text = aplTitle;
// 自身のexeファイル名を取得
exeFile = Path.GetFileName(Application.ExecutablePath);
// WSHスクリプト名
jsFile = Directory.GetParent(Application.ExecutablePath) + "\\addStartup.js";
// ショートカットのリンク名
String sMnu = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
lnkFile = sMnu + "\\" + aplTitle + ".lnk";
// [スタートアップ]フォルダのパスをtextBox1に表示
textBox1.Text = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
textBox1.ReadOnly = true;
// スタートアップ有無
checkBox1.Checked = File.Exists(lnkFile);
frmLoadFlg = true;
}
/// <summary>
/// [スタートアップに登録]チェックボックスのチェック変更時
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (!frmLoadFlg) return;
if (checkBox1.Checked)
{
// スタートアップフォルダにショートカット作成
try
{
// WSHファイル作成
using (StreamWriter w = new StreamWriter(
jsFile, false, System.Text.Encoding.GetEncoding("shift_jis")))
{
w.WriteLine("ws = WScript.CreateObject('WScript.Shell');");
w.WriteLine("ln = ws.SpecialFolders('Startup') + '\\\\' + '" + aplTitle + ".lnk';");
w.WriteLine("sc = ws.CreateShortcut(ln);");
w.WriteLine("sc.TargetPath = ws.CurrentDirectory + '\\\\" + exeFile + "';");
w.WriteLine("sc.Save();");
}
// addStartup.jsを実行し、スタートアップにショートカット作成
if (File.Exists(jsFile))
{
ProcessStartInfo psi = (new ProcessStartInfo());
psi.FileName = "cscript";
psi.Arguments = @"//e:jscript " + jsFile;
psi.WindowStyle = ProcessWindowStyle.Hidden;
Process p = Process.Start(psi);
p.WaitForExit(10000); // 終了まで待つ(最大10秒)
File.Delete(jsFile);
}
// スタートアップフォルダに登録されたか確認
if (File.Exists(lnkFile))
{
MessageBox.Show(
"スタートアップに登録しました。\n\n" + lnkFile,
aplTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
else
{
MessageBox.Show(
"スタートアップへの登録に失敗しました。\n\n" + lnkFile,
aplTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
}
catch (Exception ex)
{
MessageBox.Show(
"スタートアップへの登録に失敗しました。\n\n" + ex.Message,
aplTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
}
else
{
// スタートアップフォルダに登録済みか確認
if (File.Exists(lnkFile))
{
try
{
File.Delete(lnkFile);
MessageBox.Show(
"スタートアップから削除しました。",
aplTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (IOException ex)
{
MessageBox.Show(
"スタートアップからの削除に失敗しました。\n\n" + ex.Message,
aplTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
}
}
// スタートアップ有無
checkBox1.Checked = File.Exists(lnkFile);
}
/// <summary>
/// [閉じる]ボタン
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
// アプリケーションの終了
Application.Exit();
}
}
}
画面デザイン

ビルドしexeを実行すると、textBox1にショートカットメニューの格納先フォルダが表示される。

「スタートアップに登録」チェックボックスをONにすると、上記フォルダ上に、exeのショートカットを作成する。
これで、Windows起動時に、このexeが起動されるようになる。
あと、アプリ起動時にスタートアップフォルダをチェックしているので、スタートメニュー登録済みの場合、「スタートアップメニューに登録」がチェックONとなる。
スタートアップメニューから登録解除したい場合は、このチェックボックスをOFFにする。

これで一件落着。





