【ツール作り】ちょっと便利なスクショツールを作りたい#3【C#】

スポンサーリンク
C#
スポンサーリンク

はじめに

最終的な目標はクリックだけでスクショが撮れ、画像の編集もできるツールを作ること。現在は、クリックだけでスクショを撮る部分を作っています。

前回の記事で次のようになりました。

  • 背景を薄暗くしてスクショ撮る感を出す
  • 画面のクリックで3種類(全画面、矩形領域、ウィンドウ)のスクショが撮れる

今回はタスクトレイ常駐化などなど、細かな部分を詰めていきます。

タスクトレイ表示

「System.Windows.Forms」の「NotifyIcon」を使ってタスクトレイにアイコンを表示します。

System.Windows.Formsの参照を追加

WPFアプリとして作成しているため、「System.Windows.Forms」を使うには参照の追加が必要です。

次のようにして「System.Windows.Forms」の参照を追加します。

  1. 「依存関係」を右クリックし「参照の追加」をクリック
  2. 参照マネージャーの下部にある「参照」をクリック
  3. 「System.Windows.Forms.dll」を追加
  4. 参照マネージャーの「参照」タブで追加されていることを確認して「OK」

以下、画像でも手順を貼っておきます。

「依存関係」を右クリックし「参照の追加」をクリック
参照マネージャーの下部にある「参照」をクリック
「System.Windows.Forms.dll」を追加
参照マネージャーの「参照」タブで追加されていることを確認して「OK」

「.ico」ファイルの追加

タスクトレイにアイコンを表示するために、まずはアイコン(「.ico」ファイル)をプロジェクト内に追加します。

プロジェクトを右クリックし、「追加」>「既存の項目」でicoファイル(適当にネットからダウンロードした)を追加します。

プロジェクト名を右クリックし、「追加」>「既存の項目」から「.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を削除します。

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つ目を起動しようとすれば適当なポップアップで注意されます。

動作確認

起動後の画面上の表示はこんな感じ。(右クリックしてメニューを表示した状態)

メニューとアイコン、アイコンの説明が表示される

アイコンをクリックすると、スクショ画面になる。

最後に

やり残したことが沢山。。。

  • システムメニューを表示しない
  • スクショ画面を多重起動しない
  • 前回の撮影モードを記憶する
  • 保存先を設定できる

とか。

ほぼ完成だけど、次の記事もスクショ機能の改善だー。

コメント

タイトルとURLをコピーしました