Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

1 Push Snap Ver 1.4 - ボタン一押しで、最前面Windowをキャプチャし画像ファイルを保存する。


Zoom Meetingsをはじめとするビデオ・コミュニケーションが、日常利用において何も例外的な存在ではない時代となった。それはオンライン・ミーティングに限らず、大人数が出席する、いわゆるカンファレンスでも用いられている。

ありがちなのは、プレゼンテーションを伴いながら、その資料を配布しない場合だ。そのようなカンファレンスで、「この画面はメモしておきたい!」と思った瞬間、

  1. Alt + Ctrl + Print Screen押下
  2. ペイントを起動
  3. クリップボードからペイントに貼り付けにコピーして、画像
  4. 名前を付けて保存

などとやっている時間はない。「1 Push Snap」では、Print Screenを一押しするだけで、

  • あらかじめ指定しておいたフォルダに、
  • あらかじめ指定しておいたフォーマットで、
  • キャプチャ画像が保存される。

実際のところ、すでに同様の機能を提供するフリーウェアが存在する。しかし、気付いたときには無反応、クラッシュしており、キャプチャしているつもりが全て無駄、というトラブルを度々経験した。

そのような必要性、事情を背景に自作したツールが「1 Push Snap」だ。

この投稿では、そのツールの使い方を紹介する。

1 Push Snap

このツールはオープンソースで作成しており、C#で記述している。
実行には.NET Framework 4.8を必要とする。

Ver 1.2から、Vectorでもダウンロードできるようになった。しかし掲載までのタイムラグがある。
www.vector.co.jp

確実に最新版をダウンロードできるのはGitHubだ。はてなブログのキャッシュは古いバージョンを示しているかもしれないが、リンク先には確実に最新版が掲載されている。
github.com

機能
スクリーンショット機能 Print Screen押下で、スクリーンショットを直接ファイル出力する。
入力無効化 一切の物理入力を受け付けたくない場合に利用
キーボード入力を一切無視する。
マウス入力を一切無視する。

使い方


実行ファイル「1PushSnap.exe」を実行すると、タスクバーにアイコンが表示される。右クリックすると、コンテキスト・メニューが表示される。

Information


キャプチャ画像が出力されるフォルダを確認できる。
ユーザー・フォルダ(%userprofile%)をデフォルトの保存先としている。これはメニュ「Save To...」で変更できる。

Save To...


キャプチャ画像を保存するフォルダを指定する。

もし画像ファイル出力時に、指定したフォルダが存在していなかった場合は、強制的にユーザー・フォルダへ画像出力する仕様だ。エラー表示ではなく、あくまでも画像ファイルを出力することを最優先としている。

Image format


キャプチャ画像の出力フォーマットを指定する。初期状態ではJPEGが選択されている。
次のいずれかのフォーマットを選択できる。

Start - 1 Push screenshot

このツールはキーボード・イベントを監視する。メニュー「Start - 1 Push screenshot」で監視を始める。

アイコンの色 キーボード・イベント
放置中
オレンジ 監視中

監視状態では、アイコンの色が白からオレンジへ変化する。この状態でPrint Screenキーを押下すると、そのときの最前面Windowがキャプチャされ、その画像が指定のフォルダへ保存される。

Pauseキーを押下すると、キーボード・イベントの監視を中止する。アイコンの色がオレンジから白へ変化する。これはメニュー「Stop」を選択したのと同じ処理だ。

Start - Ignore key type

一切のキーボード入力を無効化する。
マウスは利用可能。

Start - Ignore key type

一切のマウス操作を無効化する。
キーボード操作は可能。

Stop

「Start - ***」で開始した機能を停止する。

Close

ツールを終了する。

余談-Ver 1.3からの進歩

キーボードにハンディ・クリーナーをかけたり、トラックボールの支持球周辺をブラッシングしたり、ボールをみがいたり...、入力機器を手入れするとき、その操作を無効にするための機能を実装した。
例によって、実装そのものは大した労力ではないのだが、その周辺事柄に悩まされ、時間を浪費することになった。スレッド処理に伴う「Cross-thread operation not valid」と、InvokeRequiredの活用は定番のイディオム的な存在だが、今回は違った。

Ver 1.3までは、フォームを表示していない。そのためInvokeRequiredがコントロール・チェーンをさかのぼってハンドルを見つけることができず、結果としてFalseが返される。*1

色々と試行錯誤した結果、フォームを非表示にするのではなく、隠すのがシンプルな解決策なのだ。

シングルトンとstaticについて、プログラムの書き方を整理した。