Launch Time 立ち上げ饂飩

作品情報

作品名
Launch Time(ランチ タイム)立ち上げ饂飩(たちあげうどん)
作者名
はりまお
制作機材
Core i7-4770 3.40GHz + 8GB RAM
Windows 10 Pro  (64bit, 22H2)
開発言語
Visual Studio Community 2022
Visual Basic (Windows Form アプリケーション)
動作環境
.NET Framework 4.8
形態種別
フリーソフトウェア(ソース同梱)

出張

Visual Basic 中学校さんの「投稿プログラム」コーナーにて掲載中です。(2013年06月16日~)

現在、投稿プログラムの受付を中止されているようなので、掲載して頂いているバージョンが旧世代(本体実行ファイルがVer.1系統)のままになっています。
その後の改造により、UI面・機能面でも差異が生じている可能性があります。

最新版は、当ページまたはVectorさんより入手してください。

Vectorさんでも掲載中です。(2015年03月12日~)

なんと『新着ソフトレビュー』に掲載して頂きました。(2015年03月23日付)

画面写真

画像は全て開発中のものです。
使用例
使用例

ダウンロード

LaunchTime.zip(配布ファイル更新日:2025年04月22日) / Vector(Ver.2.8.2.0:2025年04月23日)
収録内容
名前バージョン概容
ソース
LaunchTime ソースフォルダ
アプリケーション
LaunchTime.exe 2.8.2.0 本体(ランチャ)の実行ファイル
SettingConsole.exe 1.6.1.0 設定コンソールの実行ファイル
クラス ライブラリ
DialButton.dll 1.1.1.2 ダイヤルボタン用
KeyInputBox.dll 1.1.0.2 鍵入力ダイアログボックス用
Setting.dll 1.5.1.0 設定パラメータ用
ドキュメント
Readme.txt 説明文(本文)
QuickManual.txt 簡易説明書
ChallengeLog.txt 簡易更新情報

今版更新概略

"LaunchTime.exe"
一括構築済み格納アイテムで未構築画像を消し忘れていたのを修正した。
起動直後に勝手にホバー展開が発動してしまう問題に対処した。
"Setting.dll"
初回のホバー開始イベントを無視するフラグを追加した。
内部作成
名前作成元概容
フォルダ
LaunchMenu LaunchTime.exe ランチメニュー登録フォルダ
ファイル
SystemSetting.* SettingConsole.exe システム設定ファイル
.xml…現行 / .old…リビジョン更新前 / .bak…設定変更前
KeySetting.* 鍵設定ファイル(隠しファイル)
.xml…現行 / .old…リビジョン更新前 / .bak…設定変更前
LaunchTime.lnk LaunchTime.exe スタートアップ登録用ショートカット(本体実行ファイルと同名)

概要

タスクトレイ(通知領域)に常駐する、メニュー選択型ランチャソフトです。

とにかく「面倒臭がり屋でも日常的に使える物を」と試行錯誤を繰り返した結果、「メニュー展開からアイテム選択まで、たったの1クリック!」と言う形で結実しました。
そんな簡素で手間いらずのお気軽ランチャです。

“お気軽”と言いながらもかなりの文量に膨れ上がってしまいました(文才が乏しいのです)。ですが、見た目に気圧されることはありません。使い方で難しい部分なんて皆無です。Windowsが普通に使えるなら大丈夫です。きっと。

インストール/アンインストール/アップデート

本作を使用するためには、『.NET Framework 4.8』が必要です。もし、未導入ならネット上の情報を参考にインストールしておいてください。

インストールは、新たに作成したフォルダに、圧縮ファイルの中身を解凍するだけです。

アップデートは、本作を起動中なら終了しから、収録ファイルを上書きします。

※設定パラメータの改変により、一部パラメータが初期化される可能性があります。完全な互換性を持たせた設計ではないため、上手く引き継げない場合があります。起動後に設定を見直すことをおすすめします。

アンインストールは、基本的にインストールしたフォルダや作成したファイル等を全て削除するだけです。具体的な手順は、以下の通りです。

  1. スタートアップに登録している場合は、解除する。
  2. 本作を終了する。
  3. ランチメニュー登録フォルダに登録している物の中で、必要なものを退避する。
  4. インストールフォルダ以外にランチメニュー登録フォルダを置いている場合は、削除する。
  5. インストールしたフォルダを丸ごと削除する。
※スタートアップへの登録を解除する前に本体の実行ファイルを削除してしまった場合は、スタートアップフォルダ(『名前を指定して実行』で "shell:startup" を実行すれば表示できる)の中から対象項目(デフォルトでは"LaunchTime")を削除してください。

本作は、レジストリの変更,説明にないストレージ操作,外部との通信といった行為を一切行いません。

アンチウィルスソフトについて

Vector様からの報告によると、"SettingConsole.exe"が、Nortonによりマルウェアと誤認され削除されるようです。
使用しているウィルス対策ソフトの取扱説明書に従って、スキャン対象から外してください。(心配なら、ご自身の目でソースコードを精査した上で自前でビルドを行ったり、サンドボックスで試用するなど、何らかの防衛策を講じてください。)

使い方

起動と終了

起動は、本体実行ファイル("LaunchTime.exe")を実行するだけです。

起動すると、タスクトレイ(通知領域)にアイコンが登録され常駐します。
Windowsと共に自動起動させたい場合は、スタートアップに登録します。登録と解除は、【システムメニュー】-[自動起動]をクリックして行えます。チェックが付いていたら、登録済みです。

終了させたい時は、【システムメニュー】-[終了]を選択してください。また、Windowsが終了すると、本作も終了します。

※【システムメニュー】については、“システムメニューを開く”を参照してください。

システムメニューを開く

【システムメニュー】は、設定をしたり、バージョンを確認したり、終了したりするためのメニューで、タスクトレイアイコンを右クリックすると開きます。

システムメニュー
システムメニューを開いたところ

ランチメニューを開く

【ランチメニュー】は、登録アイテムを表示するメニューで、[クリック展開]または[ホバー展開]で開きます。

クリック展開とは、タスクトレイを左クリックしてメニューを開くことです。

ホバー展開とは、タスクトレイアイコンにマウスカーソルを乗せて一定時間経過すると自動的にメニューが開く機能です。
ホバー展開によって開かれたランチメニューは、しばらく放置されると“自動撤収”機能により自動的に閉じられます。
ランチメニュー内にマウスカーソルを移動すると、自動撤収の時間計測が一時停止します。また、キーボードで操作した場合は時間計測を停止します。

【ランチメニュー】には、ランチメニュー登録フォルダに配置されたフォルダ(〔格納アイテム〕と呼ぶ)やファイル(〔実行アイテム〕と呼ぶ)が、階層構造そのままにメニュー形式で表示されます。
その他、登録フォルダを開いたり、一括実行したりする項目(〔操作アイテム〕と呼ぶ)も並びます。

ランチメニューの各層は、その層を初めて開くときに構築されます。また、登録内容に変更が加えられた場合も、対象となる層が開かれる際に再構築されます。構築には、それなりの時間を要しますので、しばらくお待ちください。
メニューが未構築なら、アイコンに黄黒帯が付きます。

ランチメニュー
ランチメニューを開いたところ

ランチメニューへの登録と削除

ランチメニュー】への登録と削除は、エクスプローラで“ランチメニュー登録フォルダ”を開いて行います。
ランチメニュー登録フォルダを開くには、以下の方法があります。

  • 【ランチメニュー】の[登録・削除]をクリックする。
  • 【システムメニュー】の[ランチメニュー登録フォルダを開く]をクリックする。
  • (もちろん、エクスプローラを操作して直接開いても問題ありません。)

ランチメニュー登録フォルダ下に配置されたフォルダは〔格納アイテム〕となり、ファイルは〔実行アイテム〕となり、それぞれの名前がそのままアイテム名になります。
変更内容は、次回【ランチメニュー】を開く時に反映されます。

※万が一、変更を感知しない場合は、【システムメニュー】をクリック展開して[ランチメニュー再構築]をクリックして下さい。

〔実行アイテム〕としては、ファイル(実行ファイルやアプリケーションに関連付けられたファイル等)を登録すれば良いのですが、なかでもショートカットアイコンの形で登録するのが、簡単かつ便利(色々と設定できる,誤って削除しても害が少ない,フォルダを〔実行アイテム〕化できる等)だと思います。

ランチメニュー登録フォルダは、以下のタイミングで作成されます。

  • 起動時
  • ランチメニューの初展開(再構築)時

裏メニュー

本作には、『裏メニュー』機能があり、裏メニューを開いたり閉じたりすることで、〔裏格納アイテム〕や〔裏実行アイテム〕を表示したり隠したりできます。
さらに裏メニューには、鍵を掛けられます。鍵については、“設定をする”を参照してください。

不可視属性を有効にしたアイテムが、裏アイテムとなります。不可視化は、エクスプローラで対象となるフォルダまたはファイルのプロパティを開き、隠しファイルにチェックを付けてOKしてください。

※隠しフォルダや隠しファイルをエクスプローラで見るには、フォルダ オプションの変更が必要です。詳細はネットで検索してください。

裏メニューの開閉は、【システムメニュー】-[裏メニュー]で行います。また、タスクトレイアイコンを中(ホイールボタン)クリックしても開閉できます。
鍵を設定している場合は、鍵入力ダイアログが開きます。

※裏メニューを閉じると、〔裏格納アイテム〕下に配置された全てのアイテムも個々の設定に関係なく表示されなくなります。
※裏メニュー機能は、後述する“使用上の注意”を理解した上で使ってください。
鍵入力ダイアログ
鍵入力ダイアログ

登録アイテムの実行

【ランチメニュー】の中から、目的の〔実行アイテム〕をクリックすれば、実行できます。この時、修飾キーの押下状況によってコマンドライン引数モードを選べます。
いずれのモードも、引数として渡す文字列をクリップボードの内容から生成しますが、〔オプション編集〕ではその文字列の確認と加工ができます。
クリップボードの中身が、文字列であればそのまま、フォルダまたはファイルであればパスの列挙(各パスをダブルクォーテーションで囲み空白文字で連結)を渡します。それ以外の場合は、何も渡しません。

  • Ctrlキー → オプション編集
  • Shiftキー → クリップボード転送
※コマンドライン引数モードは、実行先での取り扱われ方を理解した上で使用してください。

【ランチメニュー】にある[一括実行]をクリックすると、そこに格納されている〔実行アイテム〕を全て実行します。
これは、単純にメニュー順に連続実行して行くだけで、個々の起動完了を待つなどの高度な機能はありません。また、コマンドライン機能も使えません。

設定をする

本作の設定は、設定コンソールで行います。【システムメニュー】-[設定]で呼び出せます。また、設定コンソールの実行ファイル("SettingConsole.exe")を単独で実行することも可能です。

設定コンソールでは、タイトルバー右側のをクリックして各設定項目をクリックすると、解説文が表示されます。それを参考に設定してください。

裏メニュー用の鍵について、少し補足しておきます。
鍵には、マウスのホイールの回転パターンを用いる“ダイヤル”と、パスワード(半角文字列)を用いる“合言葉”の2種類があり、両方でも片方だけでも利用できます。例えば、「キーボード入力が面倒な人はダイヤル」,「無味乾燥な回転パターンを覚えるのが苦手な人は合言葉」というふうに、使い分けてもいいでしょう。

鍵の大まかな変更手順は、以下の通りです。

  1. 作成・変更・解除するをクリックし、チェックを入れる。
    → 既に鍵を設定している場合は、それを入力して認証を受ける必要があります。
  2. [[新しい鍵]]欄にダイヤルと合言葉を入力します。何も入力しなければ、解除になります。
  3. OKをクリックします。
  4. 変更または解除の確認が表示されます。
    → 鍵を新しくした場合は、再度手順2と同じものを入力し、間違いがないか確認します。
  5. 確定されます。
※鍵機能は、後述する“使用上の注意”を理解した上で使ってください。
裏メニュー
鍵は [[裏メニュー]] タブで設定する

使用上の注意(言い訳…)

ランチメニュー

ランチメニュー登録フォルダは、処理の都合上ローカルに置かれている必要があります。また、URIやUNCでパスを指定すると例外が発生します。

【ランチメニュー】を表示した後に、他の所をクリックしても消えない場合は、『自動撤収』を待つかメニューにある[閉じる]を選択してください。また、ホバー展開が反応しない場合は、しばらく後に表示されるエラーメッセージで再試行してください。(“プログラムについて”⇒“ランチメニューの開閉”を参照

【ランチメニュー】の構築中は、他のメニュー項目を選択したりせず、構築作業が終了するのを待つのが賢明です。場合によっては、メニューの表示が乱れます。(“プログラムについて”⇒“ランチメニューの構築”を参照

【ランチメニュー】の構築中または表示中に、ランチメニュー登録フォルダを直接的にも間接的にも操作しないでください。予期しないエラーで停止するかもしれません。

【ランチメニュー】を表示したときに、スクロール位置が乱れる場合がありますが、原因不明です。使用に際して深刻な影響はなさそうなので、そのままスクロールしてご使用ください。

裏メニュー

本作における裏メニュー(裏アイテムと鍵)機能は、あくまでも「他人の目に触れ難くする」ものであり、セキュアでプライベートな環境を提供するものではありません。その点を留意してお遊び程度に活用してください。

不可視属性の扱い方を理解した上で使用してください。

※裏アイテムは、ただの隠しフォルダ・隠しファイルであり、OSの設定また操作によって誰でも見ることができます。
※鍵は、設定ファイルに平文(暗号化されていない文字列)で記録されており、誰でも見ることができる上に、設定ファイルを削除することで簡単に解除できてしまいます。

タスクトレイアイコン

タスクトレイアイコンにフォーカスがある状態で、Alt+F4キーを押さないでください。(“プログラムについて”⇒“タスクトレイアイコン”を参照

プログラムについて

.NET Frameworkと少しばかりのWin32 APIの組み合わせでできています。ちょっぴりややこしい部分もありますが、根気さえ続けば解析できると思います。気が向けば、お好きなように改造してください。
変数の意味や技術的な概要(そんな大げさなものじゃないけど)については、コード中に注釈として書いてあるので、参考にしてください(なれば良いのですが…)。

ソリューションを開く

ソースフォルダを配布するにあたって、".vs","bin","obj"フォルダを削除しています。
そのため、Visual Studioでソリューションを開くと、ユーザーコントロールを使用しているフォームにエラーが出てしまいます。一旦ビルドして、開き直してみてください。これで正常になると思います。

二重起動の禁止

多重起動してメニューを使い分けるのもありかと思ったのですが、結局シンプルに二重起動禁止に落ち着きました。
と言うのも、実行ファイルは別々のフォルダに存在しなければならない(ランチメニュー登録フォルダ・設定ファイルの重複回避),異なる実行ファイル名でなければならない(スタートアップ用ショートカット名の重複回避)など、なにかと面倒過ぎるのです。そこまでしなくてもメニュー階層を分ければ済むじゃないかと考えて見送りました(タスクトレイのアイコンやランチメニュー登録フォルダを変更できるのは、その名残だったりします)。
多重起動というアプローチでは駄目だとハッキリしたので、再挑戦するとしたらタスクトレイにアイコンを多重登録する手法になるでしょう(なぜ最初からそう考えなかった…)。

自動起動

【システムメニュー】-[自動起動]は、Windowsのスタートアップ フォルダに実行ファイルと同名のショートカットがあるかどうかで、チェックマークと動作を切り替えています。なので、ショートカット名の都合等で正しく認識できない場合があります。ちなみに、【システムメニュー】を開く時に登録状況を確認しています。

設定ファイル

設定ファイルには、"SystemSetting.xml"と"KeySetting.xml"があります。
これらは、作業フォルダ(カレントディレクトリ)に作成されます。作業フォルダは、通常、実行ファイルと同じフォルダです。実行ファイルのショートカットアイコンを作成し、その[作業フォルダ]欄を変更することで、保存先を変更することが可能です。

"SystemSetting.xml"は、システムに関する設定内容が保存されます。
設定コンソールのOKボタンをクリックしたタイミングで、変更の有無にかかわらず作成(上書き)されます。
このファイルには、設定コンソールからは変更できない項目が存在します。詳細は、“資料”⇒“表1”の通りです。

"KeySetting.xml"は、裏メニューで使用する鍵が保存されます。
鍵を変更して設定コンソールのOKボタンで確定したときに作成(上書き)されます。
ファイルには、『隠しファイル(不可視属性)』が設定されます。ただ、暗号化・難読化は難しそうだし、裏アイテムも単なる隠しファイルで鍵だけ厳重に守ってもあまり意味がないので、平文で書き出しています。よって、誰にでも見られますので、絶対に過信しないでください。

両ファイルとも、XML形式のテキストファイルなので、テキストエディタで変更可能です。ただし、大文字と小文字が区別されるので十分注意してください。システムメニューを経由せずに変更された内容は、【システムメニュー】-[設定]を選択し[適用]ボタン(設定ファイルの更新日時が変わっていたり、ファイルが削除または作成されていたりすると表示される)をクリックすれば反映されます。
前述の通り、これらのファイルは起動しただけでは作成されないので(デフォルト値と同じ値を、ファイルから読み込むのはなんとなく無駄な感じがして…)、直接書き換える場合は、予め作成しておく必要があります。

設定ファイルが保存される時に、旧ファイルのバックアップを残します。"*.old"はリビジョン更新前、"*.bak"は変更前のファイルです。

タスクトレイアイコンのホバー

タスクトレイアイコンの上にマウスカーソルが乗ったことは、NotifyIcon.MouseMoveイベントで検知しています。
ところが、タスクトレイにアイコンを登録したときにも、このイベントが発生することがあるようで、ホバー展開に失敗する事態が発生していました。
しかし、マウスカーソルがタスクトレイアイコンの上に乗っているのかを知る術がありません。そこで、起動後初のNotifyIcon.MouseMoveイベントを無視するようにしました。
この挙動は、設定ファイルの<初回イベント無視>(“資料”⇒“表1”参照)で制御できます。

ランチメニューの開閉

本作では、【ランチメニュー】をマウスカーソルのホバーや左クリックで展開しようと目論みました。
【ランチメニュー】の正体は、タスクトレイアイコンに登録されたコンテキストメニュー(【ランチメニュー】と【システムメニュー】を適宜差し替えている)なのですが、右クリック以外で展開するとなると、自前で何とかしなければなりません。そこで、下に記す3つの手法を組み込みました。なぜ、1つに絞れないのかというと、そこには何ともスッキリしない事情が横たわっているのです。

最初に試みた手法が、『メソッド呼出』です。
単純にコンテキストメニューの展開機能(《ToolStripDropDown.Show》メソッド)を呼び出します。このメソッドを呼べば、確実に開きます。反面、タスクバーに重ねられなかったり、メニュー以外をクリックしても閉じられなかったり、キー操作を受け付けなかったりと、なぜかコンテキストメニューとしての普段通りの振る舞いをしてくれません。

『メソッド呼出』の症状を解消すべく、ネットを彷徨って見つけてきた手法が、『メソッド抽出』です。(“参考・引用文献/拝借物”⇒“リファレンス/サンプル”参照
これは、タスクトレイアイコン(《NotifyIcon》)が(内部に?)持っている『自身に登録されたコンテキストメニューを開く機能(メソッド)』を叩く裏技的(?)なテクニックのようです(作者自身よく解っていません)。掲載元の解説には「メニュー以外のクリックで閉じられる」と謳われていますが、実際のところ100%とはいかないようです。

そんな『メソッド抽出』ですが『自動撤収』を組合せることでお茶を濁せたし、怪しい振る舞いもOSあるいは.NETの問題だとすれば作者の関知する所ではない(いずれ解消するかも)と、放ってきました。ところが、環境がXP→8.1→10と移り変わるにつれ、閉じない頻度が増したように感じたり、ホバー展開に失敗するようになったりと、何だか雲行きが怪しくなる一方です。
こうなると、こちら側で抜本的解決策を探らねばダメかもと、既知の諸症状から仮説を立ててみました。「タスクトレイアイコンまたはコンテキストメニューがアクティブになっていないのが原因?」→「OSによるフォーカス捌きがこちらの思惑と異なっている?」→「展開のトリガーとしてクリックが存在しないから?」→「クリックさえ伴えば万事解決!」するのではないかと。そう睨んで引っ張り出してきた奥の手が、『疑似右クリック』です。
少々力業な感は否めませんが、マウス操作やキーボード操作を再現できるWin32 APIの《SendInput》を使って、『タスクトレイアイコンを右クリックした』という状況を作り出します。そんなこんなで慣れない(扱いづらい)APIに四苦八苦した成果やいかに…やはり、厳密には実際のマウスのクリックとはどこか違うようで、芳しくありませんでした。

これまでの制作過程で、上に挙げた症状が現れる場面をいくつか発見しました。
例えば、“タスクマネージャーやノートンのウィンドウがアクティブな時”や“ノートンのタスクトレイアイコンのコンテキストメニューが表示されている時”にホバー展開すると、『メソッド抽出』では閉じられなくて、『疑似右クリック』では開かない症状が見られました。
また、スタート画面を開いたり閉じたりした直後にタスクトレイアイコンのコンテキストメニューを開くと、タスクバーの裏側に表示されて、閉じられずキー操作も受け付けない状態になります。これに関しては、他のアプリケーションでも同様なので、Windows側の問題だと思います。
これらの条件に当てはまらない不確実な発症もあり、なかなか尻尾を掴めません。

幾多の手を講じようとも根治できぬなら、せめて粗が目立たないようにせねばと、あの手この手で取り繕っておきました。
閉じない問題を回避するために、ランチメニューのトップに[閉じる]を設けました。でも、「いちいちマウスで選択するのは美しくない!」ので、『自動撤収』を編み出しました。
開かない問題に対しては、一定時間後に開いていなかったらやり直す処理を加えました。この時、エラーメッセージを出してクリックしてもらうことで確実にフォーカスを奪取します。フォーカスさえ手中にできれば、もう思うが儘です。
更に、動作検証も考えて、ランチメニューの開き方毎にどの手法を採るか決める項目を、設定ファイルに追加しました(“資料”⇒“表1”参照)。デフォルトでは、ホバーには『疑似右クリック』、それ以外は『メソッド抽出』としましたが、この2つの差に確たるものは何もありません。ただ感覚的に、『疑似右クリック』の方が不確実な発症が少ない気がしただけです。『メソッド呼出』は、さすがに苦しいでしょう。

ランチメニューの構築

【ランチメニュー】は、登録内容を読み込み構築しながら展開するので、それなりの時間を要します。そのため、構築中にメニューを操作されてしまうと都合が悪いです。
具体的には、あるドロップダウンメニューを構築中に、他の格納アイテムをポイントすると、複数のドロップダウンメニューが表示されてしまいます。また、構築中に実行アイテムをクリックすると、表示済みのメニューは消えて、構築中だったドロップダウンメニューだけが取り残されてしまいます。
これは、ドロップダウンメニューの準備処理(《DropDownOpening》イベントを発生する)部分と表示処理(《DropDownOpened》イベントを発生する)部分の間に、他のイベントが割り込んでしまうためだと思います。
しかし、この問題を回避する方法が思いつきません。ドロップダウンメニューの展開やメニュー項目の選択をキャンセルできれば解決しそうですが、そのような機能は用意されていないみたいです(《ToolStripMenuItem.DropDown.Opening》イベントを使えば何かできそうだけど、上手く行かなかった)。とは言え、メニューが機能しなくなるようなことはないので、今の所諦めています。
残骸が残ってしまった場合は、メニューを開き直すか、項目を選択すれば消えます。

【ランチメニュー】の複数層一括構築は、“再帰呼び出し処理”で行っています。
再帰呼び出し処理は、簡単にツリー構造を読み込めるため便利なのですが、階層が深くなり過ぎるとエラー(StackOverflowException)が出てしまいます。
どのくらいで駄目なのか不明な(知らない)上に、マイクロソフトの説明によると「.NET Framework Version 2.0 以降は、StackOverflowException オブジェクトを、try-catch ブロックによってキャッチすることはできません。」ということなので、設定ファイルに<再帰呼出限界深度>を設けて適当な値に制限してしまうことにしました。したがって、この値が、一括構築深度機能の上限値となります。
<再帰呼出限界深度>のデフォルト値は、10階層にしていますが、これだけあればとりあえず十分だろうし、この程度ならエラーにもならないと思います(ちゃんとテストしていません、ごめんなさい)。エラーにならない範囲で、お好みの値に書き換えてください。

※<~> … 設定ファイル"SystemSetting.xml"内の項目名(“資料”⇒“表1”参照

【ランチメニュー】に表示するアイコンは、《System.Drawing.Icon.ExtractAssociatedIcon》メソッドで取得しています。(“参考・引用文献/拝借物”⇒“リファレンス/サンプル”参照
しかし、このメソッドには弱点があります。
1つ目は、32*32ドットの画像(大きいアイコン)しか取得できないことです。16*16ドット(小さいアイコン)が欲しいので、試しに《New System.Drawing.Icon(~取得アイコン~,16,16)》としてもくれません。なので、縮小して使う破目になるのですが、補間が働くとは言え潰れてしまいます(CRTから液晶に代わったからか多少は見られるようになったけど)。でも、ただ潰したので勿体無いので(あぁ貧乏性)、アイコンを大きくする機能も設けました。
2つ目は、フォルダのアイコンを取得できないことです。メニューは階層構造なので、アイコンがなくても格納アイテムであるのは判るのですが。より区別し易いようにと着色しておきました。
Win32 APIの《SHGetFileInfo》関数ならどちらも取得できるみたいなのですが、遅いらしいし(画像の縮小だってリソースを喰うだろうに)、せっかくメソッドを用意してくれているので…(メソッド名からしてAPIの《ExtractAssociatedIcon》関数をラップしているのかも)。

ランチメニューに並ぶ実行アイテムのソート方法として『自然順』を選択できます。これで、エクスプローラの名前順と同じ並びになると思います。
この順序判定には、Win32 APIの《StrCmpLogicalW》関数を使用していますが、ネットの情報によると「推移的ではない(『A<B 且つ B<C である』なら『Cは最大である』と推定してくれない?)ため、無限ループに陥る可能性がある」とされています。
しかし、例え比較式がそうだとしても、全ての文字には一意のコードが割り振られている(はずだよね?)わけで、矛盾を来す事態など起こり得るのか…作者には想像できません。
特に対処法もないので、何もせずそのまま使用しています。とはいえ、素人考えなどあてになりません。万が一『応答なし』になってしまう場合は、他のソート方法に切り替えてください。

ランチメニューの土台となるコントロールに、《ContextMenuStip》から派生したユーザーコントロールを使用しています。マウスホイール・PageUp/PageDownキー・アクセスキー使用時のスクロールを改善しています。

ランチメニューへの登録

アイテムの登録機能を自前で用意するのは面倒臭いので、エクスプローラに丸投げしました(Windowsユーザーで使えないなんて極少数でしょうし、ネットで簡単に得られる知識で、覚えて損もないですから)。

どうしても登録機能が欲しいなら、作ってみてはいかがでしょうか。
ショートカットの作成方法は、後述の“参考・引用文献/拝借物”⇒“リファレンス/サンプル”参照に記載したサイトで紹介されています。ただし、DOBON.NETさんによると「WSHでは、フォルダのショートカットが作成できない」そうなので、少々ハードルが高いかもしれません。
あるいは、コマンドプロンプトで「rundll32 appwiz.cpl,NewLinkHere ~path~」("~path~"にショートカットアイコンの作成場所を記入)を実行すれば、エクスプローラの[新規作成]-[ショートカット]と同じウィザードを呼び出せるという情報もあるので、もしかしたらこっちの方が使えるかも知れません。(と思って、Win8.1で《Interaction.Shell》メソッドを使って試作してみたけれど、呼び出すことができませんでした。)
結局の所、格納アイテムや複数登録することも考えるとエクスプローラが効率的だろうし、技術的にも機能的にも現実装が実用的な気がします。

登録内容の変化は、《FileSystemWatcher》クラスで監視しています。変化を感知すれば、ランチメニューの当該箇所を再構築するようにフラグを立てます。ただし、監視対照はあくまでも登録内容なので、登録フォルダ自体の改変(名前の変更など)には対応できません。また、なにぶん初めて使う機能であり、何らかの問題で上手く反応しない事態が発生するかもしれません。
そんな万一の備えとして、【システムメニュー】に[ランチメニュー再構築]項目を忍ばせておきました。

タスクトレイアイコン

タスクトレイにちゃんとアイコンが表示されているかを知る術を持っていません(ゴメンなさい)。なので、タスクトレイアイコンにフォーカスがある状態でAlt+F4キーが押されたり、アイコン登録時のタイムアウト等で、アイコンが無い事態に陥ってしまうと二進も三進も行きません。タスクマネージャから直接終了するか、PCを再起動して復旧してください。

制作後記

自作のランチャとしては、VB6時代の『立ち上げ君』(Ver.1~3)からだから、今作で4代目かな。長いこと続いてるなぁ。
そもそも、ランチャを所望したのは、「いつも使うフォルダやファイルがあって、それらを使う度にエクスプローラで辿るのは面倒やし、かといって予め全展開しとくのは邪魔やし、だからといってデスクトップにショートカットを散らかすのも好かん」っていう、面倒くさがり屋のわがままな理由から。それに、見られたくないファイルは、不可視属性で隠しておきたいでしょ? でもそうすると、更に開くのが煩わしくなっちゃう。そういう欲望をパッと解消できる魔法がランチャやったわけ。

前作『立ち上げ君(Ver.3.0.0.5)』(未公開)は、使うときに起動してツリー表示されるメニューから項目を選択して実行する形やったんやけど、これが意外と面倒臭くてどうにもダメ(って言っちゃうのはちょっと可哀想か… ランチャ以外にも色々欲しい機能(画像閲覧・スクリーンセーバー実行など)を持たせてたから十分使えるんやけど、手軽さという面ではあと一歩やったんやろなぁ)。
それに、VB6ランタイムの将来(継続)性からも、新しいプラットフォームに生まれ変わらせてあげたい。

そんなこんなで考えた、次期ランチャに求める主な要件がこれ。

  • いちいち起動したくないから、常駐型
  • 他ウィンドウの裏に隠れず、目障りにならず、邪魔にならず
  • 思い立ったら即アクセス
  • 手順は少なく、でも意思決定には手ごたえを
  • ショートカットキーとか覚えられない
  • 見通しの良いアイテム表示
  • 利用面・プログラム面共に単純なアイテム管理
  • 動作もファイルサイズも軽いに越したことはない

「そんじゃ、どうやって形にする?」っていろいろ思案してみても、どうにも標準的な作法・構造からはみ出ちゃうし、UI・登録・管理・記憶の全ての面で大袈裟になっちゃう。やっぱり妙案ってのはなかなか思いつかんもんですな。
そんな迷い人の眼前に彗星のごとく現れたのが、『MagTrayMenu』。このソフトは、“UIはタスクトレイアイコン&コンテキストメニュー、登録と管理はOSのファイルシステムにお任せ”が特徴で、Windowsの基本的なお作法だけで使えちゃう超簡単ランチャ。でも、良く考えたらスタートメニューそのものやん。こりゃもうね、灯台下暗し、目からウロコですわ…(自分がヘッポコなだけなんやけどね)。
願ったり叶ったりってことでしばらく使わせてもらったんやけど、なまじっかプログラムをかじっているが故に『MagTrayMenu』を隅々まで自分色に染めたくなっちゃって、基本的な方向性を勝手に踏襲して自分仕様のを創るぞっと決意しちゃうわけ。
生みの親のmagwayさんには、感謝感謝です。有難う御座います。とは言え、何のお礼もできないけど…。そして、一切合財引き受けてくれるOS君、お疲れさん。

ということで、立場上『立ち上げ君』の後継やけど、実態は中身も機能もバージョン番号も継続性ゼロの全く別物。名前もちょっと違うし。
ちなみに、“ランチャソフト「立ち上げ君」”やったんで「“君”らしくしよう」と“Launching Boy「立ち上げ君」”ってのが一瞬脳裏を過ったんやけど「“Launching Boy”って何だ?」って疑問が湧き上がって、“Launch”≒“Lunch” & “Boy”≒“Box”ということで“Launch Box「立ち上げ君」”となって、でも“Launch Box”はHP製PCの付属ソフトで使われてるみたいやったんで“Launch Menu「立ち上げ君」”に。そんでもって、「Lunch Menuに掛けるんならもっと食べ物っぽく」&「“立ち上げ”って“釜揚げ”と似てるなぁ」が合体して“Launch Menu「立ち上げ饂飩」”ってことで落ち着く。と思ってたら“ランチメニュー”が実行アイテム用メニューの名前になっちゃったんで“Launch Time「立ち上げ饂飩」”に行き着きましたとさ。この“Time”には、「タスクトレイアイコンにマウスを一定“時間”乗せるとメニューが開く(タイマを使ってるし)」という意味も込めてみたけど、まぁ分からんしどうでもえぇわな。

ところでさぁ、なんで鍵が2種類もあんのぉ?
それはね、面倒なパスワード入力を何とかしたくてダイヤル錠を思いついたんやけど、とりあえず動く形にするってことでお手軽に合言葉方式で制作開始。
そうこうして「開発も一段落したし、そろそろダイヤルやってみたいなぁ」と思い立った途端、「あッ、今時つるつるホイールのやつあるやん、あかんやん!」ってことに気づいちゃって。どうしたものかと無い頭でちょこっとだけ考えた結果、「両方実装しちゃったらえ~んちゃうん、二重ロックなんて何か恰好えぇし(どこが??)」ってことで決まり!(とは言っても、改良を重ねて無段ホイール対応できちゃったけどネ。)
とにもかくにも、密かに一番やりたかったダイヤルが物になって、うれしい限りやわぁ。
でも、本来“ダイヤル”って文字盤なんかのことでしょう? 似ても似つかぬボタンコントロール + マウスホイールでダイヤルやなんて無理ありすぎ。でもまぁ、そこはほら、本物を触ったこともない人間が妄想で作ったダイヤル錠風なモノってことで…ご勘弁を。
それにしても、“錠”と“鍵”の使い分けって、簡単そうで案外ややこしいね。そりゃ違いは分かるけど、文章で書こうとすると途端にねぇ。そんな訳で、いい加減に書いてます。あしからず。

自分の中での今作の最大の売りは、「ホバー展開」なんやけど、この機能に取り組んだがためにこんなに苦労するとは思わなんだ。
コンテキストメニューのポップアップ自体はすんなり達成したけど、他の場所をクリックしても閉じてくれない『ホバー展開後不全症(勝手に命名)』がどうしても解決できなくってねぇ。
切羽詰って困り果てて、苦肉の策として搾り出した最終奥義が「自動撤収」やったんやけど、これって良いかも良いかも、案外気に入っちゃったかも(もちろん、良いと思ったから創ったんやけど)。
振り返ってみたら、「あ~すれば解決できるかも」「ど~すれば回避できるのか」「こ~して誤魔化しておこう」なんて続ける内に、制作期間の大半をこの問題に費やしちゃってるよ。思惑通りに事が進んだら、全く不要な労力やったのになぁ。

それにしても、弄ったら弄っただけ、見直したら見直しただけ、さらに手を入れたい所が目に留まっちゃって切りないわ。途中までは、実行ファイルのサイズが2桁(80K~90KB)台で完成しそうなんて甘く見積もってたけど、あれやこれやと試行錯誤を重ねるうちに3桁突破。まぁ、それでも類似ソフトの中では比較的小さい方やと思うんやけど(って、そもそも数十KBもないような差にどれ程の意味が?⇒そりゃ自己満足さ!)。でも、これって単にプログラムとしての“質”が低いだけなんとちゃうやろか。“質”と言えば、例外処理ってどこまでやれば正しい(必要を満たす)のかなぁ。この辺のノウハウって、どこで習得したらえぇんやろか?

100KBの大台を超えてしまった実行ファイルを何とか小さくする方法はないものかと考えてみて、一つの安直な企みを試みた。それは、「ランチャ本体と設定コンソールの分離」&「共通部品のDLL化」の併せ技。
その結果、実行ファイルの大幅減量に見事成功!…したけれど、一族全体を合計しちゃうと大幅増量になるよね。良かったんだかどうなんだか?? 確かに、一長一短はあったけど、改造作業としてはなかなか面白い挑戦やったから満足満足。

いやぁ~何はともあれ、前作よりも圧倒的に利用頻度が高いソフトに仕上がったよ♪ 良かった良かった。それに、前述の要件もまぁまぁ良い感じでクリアできたんとちゃうかなぁ。天晴れ天晴れ。

Ver.2.8.0.0の回顧録

事の始まりは、ユーザーから要望が届いたこと。指摘の何れもが、制作方針(作者の好み)との整合性やら技術的障壁やらで目をつぶった箇所。あぁ耳が痛い。何とか取り繕った仕様とは言え、納得できる形に纏め上げた結果だし、「自分がやりたいことを、自分がやりたいように、自分でやる」のをモットーとしている作者だけに、この時は現行仕様の説明を以てお断りしてしまった(他にやりたい案件もあったし)。うぅ胸が痛む。
「これも一意見」と受け流したつもりでいても、後ろ髪を引かれてしまう。心に引っ掛かっていると、課題解決に繋がりそうなサンプルコードが手に入ってしまう。いざ手にすると「あれをこうすれば、我を通しながら要求を満たせるんじゃないか」と妙案が芽生え始める、下心が疼き出す、もうすっかり自分の欲求に。
まぁ、全てに答えられやしなかったけど。その代わりに、技術検証の過程で.NET 6.0だとメニューの上下スクロールボタンが幅広になっているのを知ってしまった。ボタン拡大は頓挫した課題の一つ。こりゃもう最新プラットフォームに移植するのが得策かも。(メニューが内包するボタンを召喚できるなら外観変更も可能との目算だったが、そうは問屋が卸さなかった。伴って、端までスクロールした時に不要な側のボタンを隠すのも断念。)

ある程度要望に答えたら切り上げるつもりで始めたのに、弄れば弄るほど改修案が湧き出して、仕舞いにはVer.3と言ってしまいたいほど広範にわたって手を入れていた。
楽しい開発、好感触に煮詰まった成果物、充実かつ充足、振り返ってみるといい機会を与えてもらったのかな。…だからって「自分本位で自己実現なプログラミング」という姿勢は崩せないけど。
次の目標は.NET系への移行!? そうすれば、心置きなくVer.3に成れる………実現できるかなぁ。あっそうそう、ランチメニューが開かない…閉じない…問題には、何の光明も差しません。もう諦めの境地。

Ver.2.8.1.0の回顧録

致命的なバグが発覚した。とんだ落とし穴だった。
ランチメニューのスクロールボタンにマウスカーソルを乗せると、停止しているはずの自動撤収が再開してしまう。フレームワークの振る舞いに対する期待と錯誤による、おそらく初期からの持病だったろう。不覚。
診断がついたところで、対処は容易くなかった。
思案と試作を繰り返した中で、最も取りこぼさないであろう方法を採った。その代償として複雑な手法とならざるを得ず、また依然としてフレームワークの振る舞いに依存しているだけに、本当に根治したのか…如何なる状況でも完動するのか…保守性は…一抹の不安が残る。

資料

表1."SystemSetting.xml"にあって設定コンソールにない項目
<LaunchTimeシステム設定パラメータ>-<タスクトレイ>-<初回イベント無視>
意味初回NotifyIcon.MouseMoveイベントを無視するかを指定します。
Boolean型
初期値true
<LaunchTimeシステム設定パラメータ>-<ランチメニュー>-<構築>-<再帰呼出限界深度>
意味ランチメニューの構築時に、一度に読み込む下層フォルダの層数制限値を指定します。
Integer型, 0以上且つあまり大き過ぎない値を指定する(“○プログラムについて”参照)。
初期値10
<LaunchTimeシステム設定パラメータ>-<ランチメニュー>-<展開>-<ホバー>
意味ホバーでランチメニューを開く方法を指定します。
CallMethod = メソッド呼出
DirectMethod = メソッド抽出
RightClick = 疑似右クリック
初期値RightClick
<LaunchTimeシステム設定パラメータ>-<ランチメニュー>-<展開>-<左クリック>
意味左クリックでランチメニューを開く方法を指定します。
CallMethod = メソッド呼出
DirectMethod = メソッド抽出
RightClick = 疑似右クリック
初期値DirectMethod
<LaunchTimeシステム設定パラメータ>-<ランチメニュー>-<展開>-<再試行>
意味再試行でランチメニューを開く方法を指定します。
CallMethod = メソッド呼出
DirectMethod = メソッド抽出
RightClick = 疑似右クリック
初期値DirectMethod
<LaunchTimeシステム設定パラメータ>-<ランチメニュー>-<展開>-<成否確認時間>
意味ランチメニュー展開の成否を確認するまでの時間を指定します。
Integer型, 100以上, 単位はミリ秒
初期値1000
<LaunchTimeシステム設定パラメータ>-<ランチメニュー>-<画像拡縮手法>
意味画像を拡大縮小する手法を指定します。
Drawing2D.InterpolationMode列挙型
Default は、システムの標準手法とする。
初期値HighQualityBicubic
<LaunchTimeシステム設定パラメータ>-<裏メニュー>-<回転分離閾時間>
意味無段ホイール モード時の、同方向への複数入力を区分するための間隔を指定します。
※無段ホイールとは、ノッチのないホイールのこと。
Integer型, 1以上, 単位はミリ秒
初期値250

参考・引用文献/拝借物

毎度、有難う御座います。大変お世話になりました。

お手本

  • MagTrayMenu」 バージョン0.9.9.8 ~ 1.0.2.0

リファレンス/サンプル

ツール