ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

艦これスクリーンスナイパー(KCSS)について

艦これスクリーンスナイパー(KCSS)って何?

艦これスクリーンスナイパー(以下KCSS)は、ゲームのスクリーンキャプチャをキー操作により一枚、または複数枚連写で撮るソフトです。また、過去に遡ってキャプチャできるため、取り逃しも防げます。艦これ用にチューニングしていますが、他のソフトにも使えます。

f:id:donadonasan:20181103221315p:plain

ソフト画面例

f:id:donadonasan:20181103224344p:plain

連射撮影結果の例

特徴は?

  • 他の作業をしている最中でも、キー入力一発でスクリーンショットが保存できる
  • ゲーム画面が隠れていてもスクリーンショットを保存できる(一部制限あり)
  • キー入力前後のスクリーンショットも保存できる(マルチショット時)
  • マルチショット用のキーを連打しても大丈夫
  • マルチショットの保存枚数や保存周期、キーを複数組設定できる
  • ウィンドウがコンパクトで場所を取らない
  • マルチスレッド処理で保存するので保存が早めかも

早速使ってみたい!

最新バージョンは以下からダウンロードできます。

艦これスクリーンスナイパーの詳細情報 : Vector ソフトを探す!

取り敢えず使うための手順は以下にあります。

KCSSをとりあえず使ってみる - ドナドナされるプログラマのメモ

細かい説明

細かい説明は以下にあります。

KCSSメイン画面の説明 - ドナドナされるプログラマのメモ

KCSSの設定:キャプチャ - ドナドナされるプログラマのメモ

KCSSの設定:ホットキー - ドナドナされるプログラマのメモ

KCSSの設定:保存 - ドナドナされるプログラマのメモ

KCSSの設定:その他 - ドナドナされるプログラマのメモ

Visual studioのC++で実行ファイルのプロパティにビルド番号を埋め込む

Visual studio, 便利なのに、なぜかビルドしたファイルのバージョンプロパティにビルド番号を埋め込めない。そこで、下記にあるIncrementBuildを導入した。

Build Incrementing for Visual Studio C++ Projects – Fooling Around

動作原理

  1. ビルド後のイベントでツールを実行。
  2. ツールはツール用設定ファイルに記録されているビルド番号を参照し、ビルドしたファイルのプロパティに番号設定。
  3. ツールはツール用設定ファイルのビルド番号をインクリメント。

注意事項

バージョン情報、というかプロパティは言語ごとにある。このソフトはデフォルトでは英語に書き込んでしまうため、日本語プロパティに書き込む場合は.iniのコメントを一箇所外し

Language=1041

とする必要がある。なお、この数値は下記に記載のLocale Identifierの10進数値である。

Language Identifier Constants and Strings | Microsoft Docs

CInfoProgressCtrlの更新(プログレスバー伸長速度を切替可能に)

CInfoProgressCtrlはCProgressCtrlを継承することでプログレスバーの上に文字を表示できるようにしているのだが、このプログレスバーの欠点の一つに、バーを伸ばす速度が制限されている、というのがある。バーが縮む方向ならば瞬時に縮むので、これを利用して

SetPos(a+1);

SetPos(a);

というコードで回避するのが一般的である。ただし、これではaがRangeの上限に等しかった場合に対応できない。a+1まで伸ばせないからだ。これに対処するには、

SetRange(0,a+1);

SetPos(a+1);

SetPos(a);

SetRange(0, max);

というようなコードを書けば良い。しかし、毎回これを書くのは面倒なのでCInfoProgressCtrlを書き換え、自動でこれをできるようにした。

今回、Publicな関数としてbool SetSmoothMove(bool smooth)を追加した。これの引数smoothにfalseを設定すると、上記処理を自動でするようになる。なお、初期値はtrueなので既存のコードへの影響はないはず。

gist3a185c716e3bff2da938623bf844cdd9

ブログをやっていてよかったこと

最近、ブログをやっていて良かったなーと思うのは、過去に調べたことが記録されていること。ブログの定義から、当たり前なんだけど。今作っているプログラムにしても、過去のブログ記事が非常に役立っている。Unicode<->マルチバイトの変換とか。

ProgressCtrlの上に文字を表示

プログレスバーの上に文字を表示する必要が生じたのだが、標準のCProgressCtrlは文字表示機能が無い。どうも、Windowsのデザインガイドではテキストを表示するな!となっているようだ(1次情報未確認)。そこで、他の方が作ったものがないかなーと調べてみるも、バー部分も独自実装とするものしかなかった。そこはWindowsのものを使いたかったんだけどなあ。仕方ないので、reidphoaさんのCInfoProgressBarをベースに、バー表示をWindowsが担当するように改造した。SetWinowTextで表示する文字を設定可能。

Add text on progress control

タブコントロール内のダイアログがESCキーで閉じてしまうのを防ぐ

タブコントロールを実装するには、各タブに相当する枠なしダイアログを用意するのだが、困ったことにESCキーを押すとこのタブ内のダイアログが閉じてしまい、真っ白になってしまう。これを回避するには、タブ内の各ダイアログのOnCancel()をオーバーライドして何もしないようにすればよい。

 

gist551c663846c21afcddbd3044974fc758

CProgressCtrlのSetStateが反映されない

CProgressCtrlの色を変えようとしたがハマったのでメモ。

CProgressCtrlは、WindowsThemeが有効だとプログレスバーの色を変えるSetBarColorが無視される。そこで、SetStateでPBST_NORMAL, PBST_PAUSED, PBST_ERRORのいずれかを指定することでテーマに沿った色に変えることにした。しかし、なぜか変わらない!

ブレークポイントを設定したら変わることに気づいたので、ためしにバーの値更新周期を50msから500msにしてみたら、動いた。こんなの気づかないよ・・・。どこにもドキュメントされてないし。

以下、更新部分のソースコード

 

Updating CProgressCtrl State

追記:どうやら、プログレスバーの長さが変わっている最中にSetStateしても無視されるようだ。Vista以降では、SetPosで長さを変えると、その長さに向かってプログレスバーが伸びるアニメーションをする。このアニメーションをキャンセルすることで、瞬時にSetStateが有効になる。

 以下、サンプルコード。

gist.github.com