はじめに
最終的な目標はクリックだけでスクショが撮れ、画像の編集もできるツールを作ること。現在は、クリックだけでスクショを撮る部分を作っています。
前回の記事で次のようになりました。
- 背景を薄暗くしてスクショ撮る感を出す
- 画面のクリックで3種類(全画面、矩形領域、ウィンドウ)のスクショが撮れる
今回はタスクトレイ常駐化などなど、細かな部分を詰めていきます。
タスクトレイ表示
「System.Windows.Forms」の「NotifyIcon」を使ってタスクトレイにアイコンを表示します。
System.Windows.Formsの参照を追加
WPFアプリとして作成しているため、「System.Windows.Forms」を使うには参照の追加が必要です。
次のようにして「System.Windows.Forms」の参照を追加します。
- 「依存関係」を右クリックし「参照の追加」をクリック
- 参照マネージャーの下部にある「参照」をクリック
- 「System.Windows.Forms.dll」を追加
- 参照マネージャーの「参照」タブで追加されていることを確認して「OK」
以下、画像でも手順を貼っておきます。




「.ico」ファイルの追加
タスクトレイにアイコンを表示するために、まずはアイコン(「.ico」ファイル)をプロジェクト内に追加します。
プロジェクトを右クリックし、「追加」>「既存の項目」でicoファイル(適当にネットからダウンロードした)を追加します。

次の画像のように「.ico」ファイルが追加されます。

「.ico」ファイルの「ビルドアクション」を「リソース」にします。これでアイコンの追加完了。

アイコン表示とウィンドウ生成
「App.xaml.cs」にアイコン表示とイベント処理を追加する。タスクトレイ常駐にするため、プログラムの終了もタスクトレイのメニューから行う。
コードは次のようになった。
using System;
using System.Windows;
using System.Windows.Forms;
using Application = System.Windows.Application;
namespace ClickScreenShot
{
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
//任意のタイミングでのみ閉じる
ShutdownMode = ShutdownMode.OnExplicitShutdown;
//アイテムを生成
ToolStripMenuItem ExitItem = new ToolStripMenuItem()
{
Text = "Exit"
};
ExitItem.Click += new EventHandler(MenuItemClick);
//メニューを生成
ContextMenuStrip TrayMenu = new ContextMenuStrip();
TrayMenu.Items.Add(ExitItem);
//タスクトレイにアイコンを表示
System.IO.Stream IconStream = GetResourceStream(new Uri("icon.ico", UriKind.Relative)).Stream;
NotifyIcon TrayIcon = new NotifyIcon
{
Icon = new System.Drawing.Icon(IconStream),
Text = "ClickScreenShot",
ContextMenuStrip = TrayMenu,
Visible = true
};
TrayIcon.Click += new EventHandler(IconClick);
}
//アイコンクリックイベント
private void IconClick(object sender, EventArgs e)
{
//左クリックの場合のみウィンドウ表示
MouseEventArgs MouseClick = (MouseEventArgs)e;
if (MouseClick.Button == MouseButtons.Left)
{
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
}
}
//メニュークリックイベント
private void MenuItemClick(object sender, EventArgs e)
{
//Exit
Application.Current.Shutdown();
}
}
}
「ShutDownMode」を変更しないと「MainWindow.Close」で終了する=タスクトレイに残らないので注意(他にも方法はある)。
起動時にウィンドウが立ち上がらないようにする
WPFなのでこれは簡単。「App.xaml」からStartupUriを削除します。

同じソフトが2つ立ち上がらないようにする
自分で気を付けておけばよいような気もしますが、スクショツールが何個も起動したら消すのが煩わしいのでツール側で制限しておきます。
「App.xaml.cs」に次のusingディレクティブを追加します。
using System.Threading;
using MessageBox = System.Windows.MessageBox;
「App.xaml.cs」の「OnStartup」メソッド内に次のコードを加えます。
//多重起動の禁止
Mutex mutex = new Mutex(false, "ClickScreenShot");
if(!mutex.WaitOne(0, false))
{
MessageBox.Show("既に起動しています");
Application.Current.Shutdown();
}
これで2つ目を起動しようとすれば適当なポップアップで注意されます。
動作確認
起動後の画面上の表示はこんな感じ。(右クリックしてメニューを表示した状態)

アイコンをクリックすると、スクショ画面になる。
最後に
やり残したことが沢山。。。
- システムメニューを表示しない
- スクショ画面を多重起動しない
- 前回の撮影モードを記憶する
- 保存先を設定できる
とか。
ほぼ完成だけど、次の記事もスクショ機能の改善だー。
コメント