はじめに
最終的な目標はクリックだけでスクショが撮れ、画像の編集もできるツールを作ること。現在は、クリックだけでスクショを撮る部分を作っています。
前回の記事で次のようになりました。
- 背景を薄暗くしてスクショ撮る感を出す
- 画面のクリックで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つ目を起動しようとすれば適当なポップアップで注意されます。
動作確認
起動後の画面上の表示はこんな感じ。(右クリックしてメニューを表示した状態)
アイコンをクリックすると、スクショ画面になる。
最後に
やり残したことが沢山。。。
- システムメニューを表示しない
- スクショ画面を多重起動しない
- 前回の撮影モードを記憶する
- 保存先を設定できる
とか。
ほぼ完成だけど、次の記事もスクショ機能の改善だー。
コメント