こまけぇこたぁいいんだよ!! VerUPしました

 Ver0.76 ⇒ Ver0.80 へアップしました。 さようなら、僕らの氷河期の災厄の象徴の番号。
 追加/修正点は以下の通り。

 追加
 ・1人用ライフカウンターでのマナプール管理を可能に
 ・ライフカウンター画面からのマナプールON/OFFの切り替えを可能に
 ・2人用ライフカウンターで、プレイヤーごとにマナプールON/OFFの切り替えを可能に
 ・オプションに「アプリ起動中は自動サスペンドを行わない」の機能を追加
 削除
 ・操作メニューより「画面方向変更」を廃止
 ・オプション項目「ライフカウンター座標位置指定」を暫定廃止
 ・オプション項目「終了時に画面方向を縦にする」を廃止

 詳しくは コチラ から。

 以下謝罪コーナー。

 えー、お盆前の記事で「戻ってきたらアップする」と書いていましたが、すいません放置してしまいました。
 理由らしい理由は特にないのですが……しいて言えば仕事が忙しかったくらいで……いやほんとすいません。
 罰としてこれ書いてる途中でPCが熱暴走して突然落ちて、冷や汗流したりしましたんで、勘弁してくださいほんとヒィィィ。
 現PCがもうすぐ5年目に入るところなのですが、酷使しすぎたせいでそろそろ危ないっぽいです。そうでなくても最近PC内の埃とか全然掃除してなかったし、次の休みの日にはちょっと掃除しようかなと思います、デフラグとかもかねて。

 そして今後の予定ですが、絶対にやらねばならないのはアイコンの用意。それと、2人用画面側の操作メニューの改善、マナボタンの座標化、などを予定しています。それらが終わったら一応完成として、その後はずっと止まったままの家計簿アプリの続きをやりたいですねぇ。

 余談ですがライフカウンターアプリ名の「こまけぇこたぁいいんだよ!!」って部分は、そもそも家計簿側で使ってた名前で、なんとなーくシリーズ化?的な意味でこちらにも付けてみたものです。深い意味はありません。(家計簿側は「あまり細かいところまでは管理しない程度の気楽な家計簿」って意味合いで付けていますが)

広告

ガイアの揺籃の地

 これから実家に戻る(遅)ので、その前に現在の進捗状況をば。
 ライフカウンターの、マナボタン用の画像を透過処理させるってやつですが。

 もうほとんど出来てます。
 最初は背景画像の上にマナボタンを上書きする予定でしたが、結局はマナボタン用のPictureBoxに背景画像を描画して、その上にマナボタン用画像を描画 という方法にしました。こちらのほうが処理の変更がほとんどなくて管理が楽でしたので……。
 後は実家に戻ってる間にでも実機テストをして、戻ってきてからソースをちょっと整理して、V0.8公開かなーと思います。

 V0.8で結局実装することにしたのは、以下の点。
・1人用画面でもマナ管理のON/OFFの切り替えを可能に
・実行中でもマナ管理のON/OFFの切り替えを可能に
・2人用画面で上下別々にマナ管理のON/OFFの切り替えを可能に
・アプリ起動中は自動サスペンドを防止する(仮想キーイベントによる方法のためバッテリー消費が激しくなります)

 V1.0(完成版)までの課題/検討事項。
・仮想キーイベントによる自動サスペンド防止 以外の方法の防止方法(お手上げ状態ですが)
・ライフカウンター位置、マナボタン位置を全てオプション項目化(V0.8では固定座標です)
・マナプール以外のカウンター管理(余白が……)
・2人用画面で、操作メニューを反転してる人側からも押せるようにするか?
・ア イ コ ン 画 像 の 用 意 (\(^o^)/)

 とりあえず早めに完成させちゃって、元々作ってた家計簿のほうの続きやりたいんですけどねぇ。むぅ。頑張ります。

疲れ切った反応

 SystemIdleTimerReset関数とのドタバタ その後。

 エミュでの動作を見る限り、呼び出しそのものには成功しているとは思うんですが、相変わらず原因が掴めない。もう訳がわからなくなってきて意欲が削がれつつあった今日この頃ですが、仕事中に「ん?」と思うことがありました。
 というのも、会議で議事録書くときに役立てようと思って、会議開始前にRECOZEROの設定画面をあれやこれやと弄っていたときに、ふと気になる項目が目に入りました。
↓これ

「カウンタリセットによるサスペンド防止」って多分、SystemIdleTimerReset関数使用してってことだよな……? と思い、この設定を有効にして録音開始し、放置してみる。その結果、見事に設定しておいた時間後にサスペンドされる
「おぉぅ!?」と唸りつつも今度は「パワーマネジメント設定を切り替えてサスペンド防止」とやらで試す。結果は同じ。録音は継続されてるんだけど、画面は真っ暗になって指でタッチしても反応なし。
 うーん、これは……。

 その後会議中にも、10分起きくらいに何度か画面をタッチしてみるも、完全に反応なし。30分でロックする設定にしていたのでそれぐらい置いてから電源キーを押すとやっぱりロックされてる。でも後でファイル確認してみたらちゃんと全部録音されてる。(画面触ってるときの音がノイズになっててえらい五月蝿かったです)

 うーん……。

 どうも、バックライトが自動で切れる設定だけ生かしつつ、自動サスペンドを無効にする、という機能は今すぐには作れそうにないですな……WM6.5.3の問題なのか、T-01B/IS02の問題なのか、それすらもわかりません。あぁ他のWM機が検証用に欲しい……。
 というわけでバッテリはやや勿体無いですが、以前の仮想キーを送って(keybd_event)サスペンドを防止する方法でやるしかなさそうです。んー悔しいなぁ。
(ちなみにここには書いてませんでしたが、レジストリのSYSTEM\CurrentControlSet\Control\Power\BattPowerOffの値を0にする、という方法も試しましたがこれはエミュでも実機でも効果なし。WM側で設定変えた後に値を取得してもなんかずっと180のまま固定っぽかったんで、もしかして現在は使われてないんでしょうか?)

 とりあえず残りの問題は、1人用画面でマナプール管理ONにしたとき、マナボタンの周りに白い淵が出てしまう問題への対処だけです。背景画像指定しなければ何の問題もないんですけどねー。まぁこの問題は独自コントロール作って背景透過処理を実装するか、ボタンを背景画像の上に描画しちゃうかすればいいだけなんですけど。独自コントロール作ったことって実はないのでそっちの方法を試してみたいんですが、ちょっと仕事が修羅場りそうなので、時間的に厳しいかもしれません……お盆休み取れればいいなぁ……。

嘘か真か

 実験結果。

 アプリを立ち上げて1人用ライフカウンター画面にし、そのまま1時間ほど放置してみました。
 仕事中のデスクの上で、スクリーンに浮かび上がるボーラスさんの雄姿。席の後ろを通る人の視線がチラチラと痛くて10分ほどたったところで裏返しにしちゃいましたが……。
 結果、大雑把にですが開始前は90%のバッテリー残量でしたが、1時間で60%ほどに減っていました。大体3時間ほど使い続けるとバッテリーが切れる計算ですね。ちょっとした対戦程度なら十分使用に耐え得るとは思いますが、やはり減りの早さがきびしいです。スクリーンがずっと移りっぱなしなので綺麗といえば綺麗なんですけどね……。

 ちなみにその後、「自動サスペンドさせない」の設定をOFFにし、WM側の自動サスペンド設定もOFFにして同じく1時間放置してみました。(一定時間で画面は真っ暗になりますが、電源ボタンを押さずとも画面タップですぐ元に戻る状態)この場合だと1時間たっても50%⇒50%と、かなりバッテリー消費量を抑えられるみたいです。
 まぁ本当の理想は、WMのシステム設定通りに一定時間後にバックライトが最小にはなるが、真っ暗にはならずキープしつづけること、なんですけどね……。

 やはりSystemIdleTimerReset関数を使うのがよさそうなんですが、何故うまくいかないんでしょう……うーん。せめて関数が、実行結果をTrueかFalseなり0か1なり戻してくれれば助かったんですけどね……。

-------------------------------
ちなみに宣言と呼び出しは以下。


_
Private Shared Sub SystemIdleTimerReset()
End Sub

Private Sub tmSuspendCanceler_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmSuspendCanceler.Tick
SystemIdleTimerReset()
‘現在は↓で代用中
‘keybd_event(System.Windows.Forms.Keys.MButton, 0, 0, 0)
End Sub


 多分これであってると思うんですが、むぅ……。

重荷

 WM機は設定次第で、一定時間後に自動的にスクリーンのバックライトが切れます。また、一定時間後に自動的にサスペンドするという設定も可能です。
 スクリーンのバックライトが切れているだけならば見た目上は真っ黒ですが、一応アプリなどは起動したまま動作したままになっています。しかしサスペンドされてしまうと、電源ボタンを一度押さないと復帰しません。(余談ですが、この状態でも電話の着信やプッシュ対応メールの受信は自動で行われます。某所でそのことを勘違いしている人がいたもので……)

 で、MTGLifeCounterなのですが、MTGというゲームの関係上、どうしてもライフ操作の感覚が長く空くことがあります。そこそこに頻繁に弄るとしても、設定によっては、毎度毎度サスペンドされてしまっては不便だろうということで、次バージョンで「アプリ起動中は自動サスペンドを行わない」という設定をいれる予定です。

 ここからは技術的な話なのですが、それを可能にするのがAPI関数「SystemIdleTimerReset」ということがグーグル先生のおかげでわかり、早速実装しました。この関数の役割は簡単にいうと、サスペンドするまでの時間をカウントしている値をリセットするのです。名前のまんまですね。しかしどうにもこうにも、この関数がうまく動作していないのか呼び出せていないのかわかりませんが、自動サスペンドがOFFになってくれねぇのです。
 その原因については(自分のPGミスという線も含めて)調査中ですが、あまり芳しくないです。なのでとりあえず、Ver0.80では次の方法で代理処理とすることにしました。

・API関数「keybd_event」を使用する
 要は、キーイベントが発生された(=つまりユーザがWM機で何らかの操作を行った)ということを擬似的に発生させ、システムをだますわけです。これを一定時間ごとに呼び出してやれば、その都度サスペンドのタイマがリセットされるので、望んだとおりの動作にはなります。しかし、これでサスペンド対策を行うと、以下の点が問題になります。
 1.スクリーンのバックライトがつきっぱなし
 一定時間後に少し暗くなるっていうことすらなく、常に全開状態です。そうなるとバッテリー消費が激しくなることが想定されます。これは明日から仕事中に起動しっぱにして、どれぐらい減りが早いかを大雑把にですが見てみます。

 2.擬似的に使うキーにユーザが何か操作を割り当てていた場合、誤作動を起こしかねない
 自分の場合はマウスのスクロールボタンを割り当てています。WM機でこのイベントが発生することは想定しにくいですが、一部では、WM機にマウスをつなげて操作してみたという猛者もいるそうなので、そのときが不安です。また、sortinchikeyって名前だったかな?そういうアプリでキーイベントに好きな動作を割り当てられるとのことなので、これを使っていた場合にどうなるの?って気はします。使ったことないのでよくわかってないで勝手に心配してるだけですが……。

 2のほうは心配しすぎ感はありますが、1のほうは割りと大きな問題だとは思いますので、なんとか対処したいものですが、さて……。
 
(で、気が付いたらまたこんな時間ですよ畜生。明日仕事中に寝ないように気をつけないと……)

誤まった指図

先日、飲み屋にて、T-01Bを友に渡していたときのこと。

友:へー、これって横のボタン長押しすると、マナーモードと画面向きの切り替えが出来るんだー
(音量アップとダウンのボタンのことでした)

私:え、そんな機能あるの!?

友:えっ
私:えっ

oh…
「こm(中略)MTG LifeCounter」の時期バージョンで、以下の機能は廃止します、ハハハ……。
・オプション項目「終了時に画面方向を縦にする」
・操作メニュー内「画面向きを変更」
・1人用画面でのライフカウンター位置指定機能を、暫定削除
(追加機能の関係上。また、暫定なのでオプション項目には残ったままです)

次の機能を実装予定
・オプション項目「アプリ起動中はサスペンドさせない」
・1人用画面でのマナ管理モードの実装(マナボタンの位置は暫定です)
・マナ管理モードのON、OFFをアプリ起動中に切り替えできるようにする
追記・指定画像の表示方法を、現在:実寸表示 ⇒ 画面サイズにあわせて縮小/拡大 に変更
↑これに関してはPictureBoxのプロパティ指定で出来ると思っていたのですが、CompactFrameworksでは出来ないようなので、中止します……。

次の機能は検討中
・マナ以外のカウンター管理機能(5個程度? マナ管理と同時起動はスペースなくて無理そうですが……)

向きはNX!UIに画面回転させるショートカットボックス作ってやってましたよ、ハハ……。
マナーモードも毎回キーボード出して切り替えてましたよ、ハハ……。

orz

追記
マナ管理ON時のボタンは、あれ1つ1つがPictureBoxなのですが、PictuerBoxの背景を透過させることが標準では出来ないことがわかりました。うぇ……。
検索してみたら何点か解決策らしきものがあったので、試してみようと思います。方法によっては処理の大幅な見直しが必要ですが……まぁいいか。この問題が解決して実機テストを行った後、V0.80公開の予定です。