day13.1: バージョン1.2にしてStableリリース

機能の無効化を実装し、問題なく動作することを確認した後、「あぁ、これでもういじる所はないな」と感じる。

ARROWS Tab Wi-Fi WQ1/Jを買い、欲しいソフトを作ることにし、楽しくて平日夜もプログラムしてしまう日々は終わったのだ。

TouchToKey16x16TouchToKey-1.2.zipをアップロードした後、開発ステータスを「ベータ」から「プロダクション/安定」に変更。

ググってもTouchToKeyの存在はまったくヒットしないが、いつか誰かに使って喜んでもらえれば、と思う。

day13: やっぱり(略)

設定ファイルを直すたびにTouchToKeyを再起動するのがめんどくさい。タスクトレイのアイコンを左クリックすると機能を無効化し、再度左クリックすると設定を再読み込みして機能を有効化するよう、機能を変更。機能無効中はグローバルフックを開放し、本当に何もさせない。

機能が無効になっているときはアイコンをTouchToKey16x16からTouchToKey16x16Xに変えたいので、「C# タスクトレイ アイコン 変更」でググってヒットしたタスクトレイにアイコンを表示する – C#.NET Tipsを参考にアイコンの変更処理を実装した。

実装中、アイコンはプロジェクトのResourcesフォルダに入れて管理することを知る。そうだったのか。

day12: やっぱり平日だけど(略)

操作対象ソフトでダイアログが出た場合にボタンを押せないことに気づいてしまう。なんてこった。世にあるウィンドウ操作系ソフトでウィンドウクラスを指定させるのはそういうことなのね。

という訳で抜本的改革。まず、フォアグラウンドウィンドウのみを操作対象にする。できることは減るが、処理がシンプルになり、効率も上がる。次いでウィンドウクラスも指定できるように変更。イベントを中断する処理も設定方法を変更して正式実装。

あぁ、日付が変わる。

day11: やっぱり平日だけど作業してしまう

ドラッグと見なす長さを1%~50%というような指定をした場合、デスクトップサイズを長さの基準(100%)としていたが、この仕様はいまいちであることに気づく。そのためウィンドウサイズを基準にするよう修正する。

あと画像ビューアのHamanaを操作するとき、スワイプの処理がバッティングしたため、イベントを対象ソフトに送らない処理を試験的に実装する。

あぁ、もう1時過ぎだ。休日休めていないので体力が限界に近い。

day10: 平日だけど作業してしまう

ソフトを公開したけど、やっぱり細かい部分が気になって作業してしまう。日曜日はがんばってドキュメントを作ったけど、説明が分かりづらい点があると思う。iniファイルで設定するというスタイルは端からハードルが高いのは自覚しているが、それでも説明は分かりやすい方がいい。ということで簡単な図(アスキーアート)も入れて説明文を校正。

あとサンプルにMassiGraの例を掲載してたが、無関係なソフトの名前を使うのはどうかとも思い、架空のソフト名を使うことにする。

day9.2: SourceForge.JPに参加

ユーザ登録して機能をざっと見てみる。オープンソースの開発支援サイトだからソースの公開が必要らしい。利用しているMouseHook.cs的には問題なし。ライセンスは…MouseHook.csと同じMITライセンスにする。

TouchToKeyプロジェクトの作成を申請すると、すぐに許諾メールが出た。説明と違って審査はない模様。さらに機能を試していると、プロジェクトを作らなくても作業部屋だけで事足りたことに気づく。しかしプロジェクトを削除するにはサポート要求を出さないといけないようで、また削除は推奨されないようなので、プロジェクトで作業する。

しかし、使いづらい。プロフィールの編集とユーザ管理が上下に分離しているのは分かりづらい。あと広告が悪いとは思わないが、機能をウィンドウ外へ押しやっているのはいかがなものかと思う。

バイナリのアップロードと説明文の掲載はすぐにできたが、ソースコードはリポジトリに登録しなければならないらしい。この手順が良く分からなかったが、RapidSVNでSubversionを使う場合、次の手順でいけた。

(1)PuTTYgen でRSAのキーペアを作成。
(2)OpenSSH公開鍵をSourceForge.JPに登録。
(3)RapidSVNをダウンロード、インストール。
(4)環境変数SVN_SSHに”plink -i 秘密鍵.ppk”を登録。
(5)リポジトリに”svn+ssh://username@svn.sourceforge.jp/svnroot/projectname”を追加。

あと、ブログが作れるようなので作っておく。WordPressを使うのは初めてだが、世界一メジャーなブログツールだけあって使いやすい。開発の経緯からさかのぼってエントリを作成することにする。

day9.1: TouchToKeyを公開することにする

私と同じようなニーズを持っている人が世の中にはいるかもしれない。私はタッチ操作でキーを送るソフトを見つけられなくてがっかりしたので、その人たちのためにソフトを公開しよう。などということを考え、ソフトを公開することにした。

ソフトを公開するにはどうしたらよいか。
Vectorあたりに登録すればよいだろう。などと甘く考えていたが、登録には住所、氏名、電話番号、メールアドレスが必要と、思いのほかハードルが高かった。

だったらブログを作ってそこに掲載し、あとは検索エンジンに任せるか…、などと考えたが、そもそもZIPファイルを置ける無料ブログというものがあまりなかった。
無料ブログ比較一覧表(機能・特徴)
あってもVector同様、個人情報を渡さないと作れない。

ということで、なかなか難しいものだなぁ…とググっていたところ、SourceForge.JPが目に付いた。登録するのはメールアドレスだけ。あぁ、ここでいいじゃないか。

day9: 細かいところで不都合がでてくる

昨日できあがったTouchToKeyを実際に使ってみると、いくつか不都合がでてきた。

  • 横スワイプが斜めだと縦スワイプも動いてしまう。
  • 2重に起動できてしまい、キーも2倍送られる。
  • タスクトレイのアイコンを右クリックして終了がやりにくい。

そこで、改良を加えていった。

画像ビューアをいくつか試してみるが、ほぼ問題なく使えるようになった。
昨日は16時ごろまで外出していたので、実質2日…かぁ。C#初心者がよくこんな短時間でできたものだ。逆にこんなに簡単にできるのに、なぜこの手のソフトが見つからなかったのだろう。やはり何か根本的なところを誤解していそうで怖い。まぁ、2日なら惜しくない。経験にもなったし。

day8.3: メイン処理を実装する。

さぁ、材料はそろった。設定はConfigオブジェクトに読み込み済み、必要なウィンドウの情報はWindowオブジェクトがくれる、あとはマウスフックのコールバック関数にやりたいことを書くだけだ。

LeftButtonDownは…やることがない。ドラッグの開始座標を覚えるだけ。
LeftButtonUpが本番。
ドラッグの終了座標を取得し、
(1)操作対象プロセスのウィンドウ位置(上下左右)を取得する。
(2)操作が対象プロセスのウィンドウ内の、設定領域内か判定する。
(3)操作の内容が設定された操作と一致するか判定する。
(4)キーを送信する。

1つだけ、キーで指定された文字列が不正な場合に処理が失敗するが、そこは

try
{
  SendKeys.Send(area.key);
}
catch (ArgumentException ex)
{
  //特にやることがない
}

という例外処理を設けた。

処理を実装後、ビルドすると…、動く!動くよ!あぁ、なんか完成したっぽい。

day8.2: キーを送る

キーを送る方法は。「C# キーを送る」でググる。
[C#] キーやマウスの操作を擬似的に実現する。がヒットする。

SendKey.Send({Enter})

以上!

うわー、なんてお手軽な。

キーの値は人が読める文字列になっている。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.sendkeys%28VS.80%29.aspx

設定ファイルではキーを文字列で指定し、それをプログラムでキーコードに変換する…などという処理を想像していたが、そんな必要はなかった。キーコンビネーションも記述できる。キーの送信に関する実装は次の3行だけになった。

area.key = GetValue(section, "Key", "");
area.key = area.key.ToUpper().Replace("{SPACE}", " ");
SendKeys.Send(area.key);

iniファイルでは空白を値に指定できないので、スペースキーだけは独自の文字列を定義することになった。