本記事は読者からの投稿で、Dotnet9 サイト管理者が編集しました。サイト管理者はこの小さなツールが非常に実用的だと感じ、自宅や会社でも試用を始めています。
目次:
- このツールは何に使うのか?
- 本文
- ソースコードの入手とアプリのダウンロード体験
- サイト管理者の提案
1. このツールは何に使うのか?
問:オペレーティングシステムにインストールされたアプリケーションはどこから起動しますか?
答:
- 左下のOSスタートメニュー
- OSタスクバー
- OSデスクトップのショートカット
正解、10点満点!
主にこれら3か所でアプリを探します。これらのアプリのショートカットを一箇所にまとめることを考えたことはありますか?目的のアプリをマウスでスクロールするだけで見つけ、クリック一つで起動。以下の操作はあなたの望むものですか?
アプリを素早く見つけて起動

市販されている同様のソフトウェアツールは多数あり、機能もより強力かもしれません。しかし、私たちはプログラマーです。自分で開発した小物を持っていなければ、外で語れませんよね?(笑) 以下はサイト管理者が作者のオープンソースプロジェクトを参考に、その中の一つのスタイルを抽出して作成したものです(vs 2019 + .net 5。最近のやり取りで、作者が一時的に水平メニューを削除したことを知り、笑い泣きしました。作者が後で追加してくれることを願っています):
水平メニュー

2. 本文
はじめに
最近(サイト管理者注:はてなブログ WPF カテゴリ)が静かなので、盛り上げていきます。
2020-10-29
【新規アップデート】
- トレイアイコンを追加
- スキン変更を追加
- 透明度の切り替え
【環境】
Visual Studio 2019、dotNet Framework 4.0 SDK
本プロジェクトはMVVMパターンを採用し、機能コードを簡単に紹介します。
- メインモニターの作業領域のサイズを取得
- メインウィンドウの高さを設定し、ウィンドウのLeftとTopを右端に設定
private Rect desktopWorkingArea;
desktopWorkingArea = System.Windows.SystemParameters.WorkArea;
this.Height = desktopWorkingArea.Height / 2;
this.Left = desktopWorkingArea.Width - this.Width;
this.Top = desktopWorkingArea.Height / 2 - (this.Height / 2);
- ウィンドウの移動はY軸のみ許可、Win32のMoveWindowを呼び出す
#region ウィンドウ移動
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
anchorPoint = e.GetPosition(this);
inDrag = true;
CaptureMouse();
e.Handled = true;
}
protected override void OnMouseMove(MouseEventArgs e)
{
try
{
if (inDrag)
{
System.Windows.Point currentPoint = e.GetPosition(this);
var y = this.Top + currentPoint.Y - anchorPoint.Y;
Win32Api.RECT rect;
Win32Api.GetWindowRect(new WindowInteropHelper(this).Handle, out rect);
var w = rect.right - rect.left;
var h = rect.bottom - rect.top;
int x = Convert.ToInt32(PrimaryScreen.DESKTOP.Width - w);
Win32Api.MoveWindow(new WindowInteropHelper(this).Handle, x, (int)y, w, h, 1);
}
}
catch (Exception ex)
{
Log.Error($"MainView.OnMouseMove{ex.Message}");
}
}
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
if (inDrag)
{
ReleaseMouseCapture();
inDrag = false;
e.Handled = true;
}
}
#endregion
- Tab + Altキー切り替え時に現在のウィンドウを非表示にする
WindowInteropHelper wndHelper = new WindowInteropHelper(this);
int exStyle = (int)Win32Api.GetWindowLong(wndHelper.Handle, (int)Win32Api.GetWindowLongFields.GWL_EXSTYLE);
exStyle |= (int)Win32Api.ExtendedWindowStyles.WS_EX_TOOLWINDOW;
Win32Api.SetWindowLong(wndHelper.Handle, (int)Win32Api.GetWindowLongFields.GWL_EXSTYLE, (IntPtr)exStyle);
Tab + Altで現在のウィンドウを非表示

- ウィンドウ読み込み完了時に、インストールされているアプリ(およびシステムデスクトップ)のレジストリを読み取り、アプリのパスを取得後、.ICOを抽出して.PNGに変換し保存
インストールアプリの読み取り

- 残りのコードはWPFのアニメーションとカスタムコントロールのコード
【プレビュー画像】
縦型メニュー

2020/11/09
【新規アップデート】
スクロール時にアニメーションを追加
【プレビュー画像】
縦スクロールアニメーション

縦型メニューの非表示

縦型メニューの折りたたみ

縦型メニューの切り替え

2020/11/19
【新規アップデート】
- ドラッグ移動機能を追加
操作説明:メインページで右クリックすると点線枠が表示され、アプリの位置を変更できます。ただし保存はされません。次回起動時にはデフォルトの並び順に戻ります。
- 既存の参照を見つける際にアンインストール済みのものを検出しないように修正
【プレビュー画像】

2020/11/20
【新規アップデート】
- アプリの削除機能を追加
- 編集中はボタンを非表示
- 編集中はアニメーションを停止
【プレビュー画像】

3. ソースコードの入手とアプリのダウンロード体験
ソースコードダウンロード先:SoftWareHelper

解凍後の体験版はこちら:ダウンロード
作者の投稿記事:
- Wpfで開発した実用的な小物(ソースコード付き)随時更新
- Wpfで開発した実用的な小物(ソースコード付き)随時更新(二)アプリのドラッグ
- Wpfで開発した実用的な小物(ソースコード付き)随時更新(三)アプリの削除
4. サイト管理者の提案
作者も熱意を持ってこのプロジェクトを更新し続けています。必要な方は上記リンクからダウンロード・使用し、良ければぜひスターを付けてください:SoftWareHelper

サイト管理者は作者の投稿を受け取る前から、はてなブログで作者の最初の記事を目にしてプロジェクトをダウンロードし体験しました。その中の水平クイックメニューが気に入り、抽出して修正しました(小さなアイデアの一部は実装済み、残りは空いた時間に完成予定):
- メニューは設定ファイルで構成。OSにアプリが多すぎる場合、すべてを読み込む必要はない:実装済み
- exeのドラッグ&ドロップ(またはシステム生成のショートカットのドラッグ)による追加に対応:実装済み
- URL設定に対応(クリックで指定URLを開く、ウェブブックマークのショートカットのようなもの):実装済み
- cmdコマンド設定に対応(mstscなどのシステムアプリ、リモートデスクトップのIPとポートを設定してワンクリックで接続など):実装済み
- メニューを設定するUIの提供:未実装
- アイコンとテキストの表示:未実装
- …その他のアイデアも検討中
作者が上記のアイデアを良しとすれば、ぜひ追加を検討してください。
サイト管理者は厚かましくも作者のオープンソースプロジェクトを基にした修正版を公開します。非常に簡素なバージョンです:QuickApp

上記のサイト管理者による独自改造版のアイデア以外にも、以下の小さな提案を作者の元プロジェクトに考慮していただきたいです:
- 元の水平メニューの表示スタイルを維持し、できればデスクトップの上・下・左・右すべてに対応(動的に位置を切り替え可能)
- 現在のスキンはlightとdarkの2種類のみ。今後は適宜拡張(背景色を変更する方式で可能)
その他の提案があれば、記事下部のコメント欄、または上記作者のブログ記事のコメント欄にお寄せください。みんなで知恵を出し合い、面白い小物を作りましょう!
謝辞
読者様の投稿に感謝します
- はてなブロガー:驚鏵
記事の投稿や、WPFプロジェクト・コントロールライブラリの推薦があれば、サイト管理者までお気軽にどうぞ。
- 記事内の読者リポジトリ
SoftWareHelper:https://github.com/yanjinhuagood/SoftWareHelper