他人の空似自作物置場

IkaLogのAmaRecTV制御機能をちょっとだけ便利に

プログラム名:ControlAmaRecTV

用途:IkaLogのアマレコTV連携を強化する

使い方:
* IkaLogとアマレコTVを連携させる。
* アマレコTVの録画開始ホットキーをグローバルのCtrl+zにする
* 標準プラグインの録画を自動操作する設定を有効にする
* ControlOBS.au3の代わりに同梱のAmaRecTV.exeを指定する
* あとは通常通りIkaLogを使用するだけ

公式のControlAmarecTV.au3との違い:
*メリット
** AutoITがいらない
** 録画中検出があるので録画開始できていないときの誤爆がない
** 録画フォルダの末尾に\や/をつけ忘れても動く
** アマレコTVよりファイル名を取得しているためファイル誤認が起こらない
* デメリット
** exeなので気軽に動作をいじれない
** exeなのでウイルスじゃないかの調査が大変
* どちらともいえない点
** ホットキー送信時にアマレコTVが最前面にならない

免責事項:
これに同梱されたプログラムその他が原因で発生したいかなる損害も当方は一切関知しません。
また、全てのプログラムがウイルスではないという証明も、ウイルスに感染していないという証明もありません。
自己責任でお使いください。

Q&A:
  Q:ホットキー変えられないの?
  A:コンパイルしなおせば変えられます。

  Q:コンパイルするのに必要なのは?
  A:ライブラリとしてはboost
  コンパイラはおそらくどれでもいけるとは思いますが
  作者はVisualStudio2015を使用しました。

  Q:メリットが何一つうれしくないんだけど
  A:そういう人は公式のを使うことをお勧めします。

  Q:フォルダ名末尾云々って何?
  A:IkaLogで生成されるリネーム先ファイル名は単純な文字列結合で作られているため
  フォルダ名の末尾が\や/で終わっていない場合は
  一つ上のディレクトリにおかしなファイル名で出力されてしまいます。
  おそらく仕様なのですが、個人的にはまりまくったので
  独自にファイル名を生成することで回避する機能が入っています。

  Q:リネームするファイル名変えたいんだけど
  A:フォルダ名末尾問題の対応のため中で生成しているので
  コンパイルできる環境があるなら中を書き換えれば可能です。
  具体的には
  const std::wstring FILENAME_FORMAT = L"%year%%month%%date%_%hour%%minutes%_%stage%_%rule%_%won%.avi";
  の部分

  Q:アマレコTVからファイル名取得って具体的には?
  A:ウィンドウタイトルから取得しています。
  また、そのファイルがロックされているかどうかで正しいかの検出も行っています。

  Q:コンパイル前提ならどの程度設定いじれるの?
  A:.cppの上の方にまとめてある定数で設定できます。
  具体的には、録画終了周りのタイミング調整
  リネームするファイル名、録画開始と停止を操作するホットキー、です。
  詳しくは.cppのほうを参照してください。

  Q:最前面にしないのはなぜ?
  A:単に作者が最前面ウィンドウを操作するアプリを嫌いなだけです。
  幸いアマレコTVにはグローバルフックがあるので問題ないですし。

  Q:その他バグをみつけた or 動作しない or 要望がある
  A:確認次第対応可能であれば対応します。
  公開しても問題が無いメールアドレスにて
  下部に記載されたアドレスまでメールをどうぞ。


メールアドレス:sweetie(あっと)click3.org


自作部分のライセンス:
・本ライセンスにおいて、全ての条項は「変更の有無を問わず、明示暗示を問わず、商業慈善を問わず、
  個人法人を問わず、保持使用を問わず、有料無料を問わず、全体一部を問わず、コピー派生を問わず
  実行ファイルソースファイルを問わず、故意錯誤を問わず」と装飾されている物として扱う。
・著作権者は本ソフトウェアに関する一切の保障義務をもたない。
・上記条項唯一の例外として、本ライセンスに違反した場合を除いて著作権者から
  本ソフトウェアに関する一切の法的措置を受ける事が無い事のみ保証される。
・著作権者やその他保持者がこのライセンスの範囲で行う活動に支障が無い範囲であれば何を行っても構わない。
・上記条項の”何を行っても構わない”には本ソフトウェアの製作者を偽っての再配布も含まれる。
・全ての権利の行使において、著作権者への連絡、著作権者やライセンス条項の記載、
  適用ライセンスなどの制限は一切存在しない。
著作権者名:sweetie


面倒な人向けライセンス解説:
作者やライセンスの記載義務すらありません。
再配布や改造など申告なし記述なしで好きにできます。


スペシャルサンクス:
IkaLog作者様 Takeshi HASEGAWA
偉大なるSplatoon開発者様
アイディア協力 ayokura


技術情報とどうでもいい話:
キーの送信はkeybd_eventメソッドを使っている。
必要ないとは思ったが、念のためスキャンコードの送信付き。
地味だがファイル名組み立てに軽いテンプレート処理のようなものを入れてある。
これは.iniで設定できるようにしようと考えていた名残だが
自分のやる気が続けば別の形で表に出せる日も来るかもしれない。
アマレコTVはフルスクリーン用とウィンドウモード用で二つのウィンドウを持っており
タイトルが更新されるのはそのとき使用されているほうだけになる。
なので素直にタイトルを取ってくるだけだと古い情報をつかまされて動かないという事態に陥る。
そこで非表示のウィンドウは無視する処理を入れたところ無事動作するようになった。
.exeなのは、最初DLLインジェクションによりアマレコTVの制御を乗っ取ろうと考えていた名残
今から書くならのちのことを考えて.pyか、もしくは頑張って.vbsなどで書いていただろう。
DLLインジェクションしようとした動機は、録画中ステータスをとる方法が思いつかなかったため。
更新日時やファイルサイズだけ監視しても、出力先ディレクトリがほかでも使われている場所だとダメで
ウィンドウ上のアイコンはフルスクリーン時は取得できないか嘘情報になることが予想され
ReadProcessMemoryによるメモリー読みだしはアマレコTVのバージョン差異を吸収するのが大変で
これはもうDLLインジェクションして、ハンドル一覧を取得し
.aviなファイルハンドルがあれば〜といった処理を書くしかないと思ったためだ。
だがそこでタイトルバーにファイル名が残ることに気づいたため今の形となった。
一応依存ライブラリを減らそうと努力はしたのだが、ファイルパスの取り扱いがだるかったため妥協した。
ウィンドウタイトルを集めてくるコードは自作ライブラリの中には入っているのだが
さすがにそれに依存したら(いないと思うが)ユーザーがコンパイルするときに苦労するからと
0から書いたコードが入っている。
一番つらかったのは動作検証で、コマンドライン引数あり、環境変数あり
アマレコTVの状態によっても動作が変わる、ついでにIkaLog連携時だけ出るバグ、etcetc。
当然だがリリース前にはIkaLogとアマレコTVは本番構成で試す必要があったため
ケアレスミス一回につきナワバリバトル一回分の時間が吸われて非常につらかった。