ページ

ラベル Use10Key の投稿を表示しています。 すべての投稿を表示
ラベル Use10Key の投稿を表示しています。 すべての投稿を表示

2008年03月15日

Use10Key更新

Use10Keyを少しだけ修正しました。 コメントで頂いていたサスペンド前に回線を切断しない問題の対応をしています。
少し前にいろいろ触ったときにCreateEvent()と WaitForSingleObject()の順番が逆になっていたのが原因でした。 何だかもう触るなよって感じですね。

実はもうひとつ ご連絡頂いている問題があって CorePlayer再生中にキーロックしてもサスペンドできないようです。 CorePlayerは持ってないので Media Playerで試してみたのですが、確かにサスペンドに移行しません。

原因はまだ調べきれていないのですが、もしかしてこれらのアプリはサスペンドタイマを無効にしているような気もしてきました。
もしそうなら結構面倒な問題ですね...。

2008年03月11日

Use10Key更新

先日引っ込めた Use10Keyを再度アップします。
  • (削除) up1060.zip (削除ここまで)
  • up1062.zip
    v1.4はキーロック解除時に負荷が急上昇するバグがありました。
    先日のテスト版+αの段階まで戻すと大丈夫のようですので暫定的に置いておきます。
    お知らせ頂きありがとうございました。

基本的にはSetSystemPowerState()に POWER_FORCEオプションを指定している程度です。

幾分マシになっているのではないかと思いますが、タイマーでサスペンドに移行した後でキーロック→解除した場合は画面が戻りません。

ただ、標準状態でもサスペンド中のキーロック→解除では画面は戻らないようなので これはこういうものだということで大目に見てやってください。

2008年03月08日

Use10Key更新

Use10Keyを更新しました。
コメントでご連絡頂いていた キーロック解除時に画面が消えたままになっていた問題に対応したつもりです。
  • (削除) up1051.zip (削除ここまで)
    (03/09 追記)
    修正が不十分だったようですので、いったん引っ込めます。

Use10Keyでは /klsuspendや /klforceオプションが指定された場合、RequestPowerNotifications()を使って電源状態を監視しています。
キーロックが解除されたタイミングで監視スレッドもしていたつもりだったのですが、タイミングによっては監視スレッドが終了せずに画面が消されていたようです。

キーロック解除時に WaitForSingleObject()で監視スレッドの終了を待とうかとも思ったのですが、 電話アプリの中で待ち時間をつくるとよくなさそう(「Windows Mobileプログラミング徹底理解」で触れらていた「1秒ルール」?)なので、単純に監視スレッド内でキーロックが解除されているかどうかをチェックするようにしてみました。

そういえば NetFront v3.5のためにCPUの優先度をアクティブアプリ優先にしてみたところ、電話がうまく受けられなかった事がありました。
もしかしたら優先度か下がることによって 1秒ルールを破ってしまったのでしょうか。 もっと無駄を省けるように コードを見直してみないといけませんね。

2008年02月06日

Use10Key更新

Use10Keyのサスペンド機能を切り離そうとしていたのですが どうもうまく動いてくれないので、とりあえずの問題修正版をアップしておきます。
主な変更点はサスペンド中にリセットした場合にサスペンドの設定が短いままになっていた問題と /klforceオプション使用時にUSB接続した場合に画面が点滅していた問題への対応です。
但し v0.9ベースではなくサスペンドのタイマを変更する方法なので、キーロックした瞬間に電源が落ちた場合等には同様の問題が発生する可能性があります。

また、キーロック時に無線LANで通信が行われている場合は通信の終了を待ってサスペンドするように変更しました。

その他 試行錯誤中に気付いた点をいくつか修正していますが、毎度のことながらそのために新たなバグが入っている可能性もあります。
先に白状しておくとキーロックを解除したときに画面が消えたままになっている場合があるみたいです。
その他で何かあればこっそり教えて下さい。

2008年02月03日

サスペンドは問題山積

Use10Keyのサスペンド問題。
サスペンド機能を別アプリにすることで解決できそうだったのですが、実際に動かしてみるとメールを受信できませんでした。

何だか変更する度に退化しているような気がしてきました。
それでも若干の整理はできたので、もう一度 v0.9あたりをベースに考え直した方がよさそうですね。

いっそサ画面オフだけにするなら大半のコードが削れるのですが...。

2008年01月31日

どこからサスペンドさせるか?

Use10Keyサスペンド機能を修正しています。

まずはUse10Key v0.9でサスペンドさせた場合、
  • 電話が着信するとサスペンドが解除されて通話可能
  • 電話が終わると即座にサスペンドに戻る
    RfLedRestrictorによるLEDの消灯不可、その後の着信で問題発生

対してKeyLockSuspenderでサスペンドさせた場合、
  • 電話が着信するとサスペンドが解除されて通話可能
  • 電話が終わるとサスペンドに復帰
    LEDの消灯はできないが、その後の着信は問題なし

この致命的な差はどこから来るのでしょうか?
確認のためにUse10Keyと同じ方法でサスペンドさせるだけのプログラムを作ってみました。

結果、
  • 電話が着信するとサスペンドが解除されて通話可能
  • 電話が終わるとそのまま(サスペンドに戻らず)

どうやら電話が終わってから即座にサスペンドに戻るのはUse10Keyが電話アプリを乗っ取っている副作用のようなものだったみたいですね。

それならばと /klforceオプションで使っているSystemPowerStateの監視も組み込んでみました。
かなり端折っていますが、要はバックライトがついたらサスペンドさせています。
HANDLE hPowerMsgQ = NULL,
 hPowerNotify = NULL;
DWORD dwPowerMsgSize = sizeof(POWER_BROADCAST) + (MAX_PATH * sizeof(TCHAR));
MSGQUEUEOPTIONS mqo = {0};
mqo.dwSize = sizeof(MSGQUEUEOPTIONS); 
mqo.dwFlags = MSGQUEUE_NOPRECOMMIT;
mqo.dwMaxMessages = 4;
mqo.cbMaxMessage = dwPowerMsgSize;
mqo.bReadAccess = TRUE; 
hPowerMsgQ = CreateMsgQueue(NULL, &mqo);
hPowerNotify = RequestPowerNotifications(hPowerMsgQ, PBT_TRANSITION);
while (WAIT_OBJECT_0 == WaitForSingleObject(hPowerMsgQ, INFINITE)) {
 DWORD dwRead = 0,
 dwFlags = 0;
 PPOWER_BROADCAST pPBCast = NULL;
 
 pPBCast = (PPOWER_BROADCAST)malloc(dwPowerMsgSize);
 if (pPBCast) {
 while (ReadMsgQueue(hPowerMsgQ, pPBCast, dwPowerMsgSize, &dwRead, 0, &dwFlags)) {
 if (PBT_TRANSITION == pPBCast->Message && 
 POWER_STATE(pPBCast->Flags) & POWER_STATE_BACKLIGHTON
 ) {
 // 画面が点灯したら即座にサスペンド
 SetSystemPowerState(NULL, POWER_STATE_SUSPEND, 0);
 }
 }
 free(pPBCast);
 }
}

結果は、
  • 電話が着信するとサスペンドが解除...と思いきやすぐにサスペンドに移行
    その後の電話着信不可
電話アプリ内から呼び出していた場合と違って通話中でもサスペンドしてしまうんですね。 仕方がないので、通話中だった場合は通話が終わるのを待機するようにすることで ほぼ期待通りの動作をしてくれました。

結論としては Use10Keyの一部としてサスペンドを組み込むことは難しそうです。
別アプリにした場合も、電話アプリの中からいちいちCreateProcess()して問題ないのかどうか悩みどころですね。

2008年01月25日

Use10Key更新

2chのアドエスソフトスレで Use10Keyについてのコメントを見つけました。
496 名前: 白ロムさん [sage] 投稿日: 2008年01月25日(金) 14:24:51>>494 
KeyLockSuspender 
RfLedRestructorと併用できない 
Use10Key 
ロックすると無線LANを切る 
サスペンドだと回線が切断されるまで画面がついたまま 
KLChgExec 
何でもできるが面倒 
MortScriptと組み合わせると遅い 

無線LANに関しては個人的には切断してしまった方が便利なので このような仕様になっているのですが、やはり何が便利なのかは使う人それぞれですよね。

という訳でサスペンドから復帰時に無線LANの電源を戻すオプションを追加してみました。 切断待機中についても画面を消すように変更しています。
他にもサスペンド復帰時に一瞬画面が消えるというコメントがあったのですが、今のところ自分の環境では再現できていません。

と言ったような事をソフトスレに書き込もうとしたのですが、自宅のプロバイダ・PRINともに規制されていて書き込む事ができませんでした。
ZERO3のスレに ZERO3で書き込めないというのも困りものですね。

2008年01月23日

Use10Key更新

Use10Keyを更新しました。
と言っても、例によっておまけ機能のサスペンド関連ですが...。

1つ目はここ数日悩んでいたサスペンド中の電話着信の問題。
SetSystemPowerState()でサスペンドさせると電話終了時に有無を言わさずサスペンド状態に戻ってしまっていたので、レジストリを変更してサスペンドへの移行時間を短くする方法に変更しました。

参考にしたのはこの辺りです。
レジストリを変更した後に "PowerManager/ReloadActivityTimeouts"というイベントを投げてやるのがキモのようですね。

注意点として万一サスペンド中にリセットしてしまった場合はすぐにサスペンドしてしまう状態で起動してしまうため、サスペンドに移行しないように注意しつつ[設定]-[システム]-[パワーマネジメント]-[詳細設定]で設定を元に戻してやる必要があります
かなりアレな仕様ですが、電話が使えなくなるよりはマシだということでご理解ください(笑。


2つ目はパケット通信中の場合はパケットの送受信が無くなるのを待ってサスペンドするように変更しました。
以前メール送信途中で誤ってサスペンドさせたためにメールが未送信のままになっていたので その対応です。

このためネットラジオ等を聴いている状態でサスペンドさせた場合、いつまで待ってもサスペンドしないと思います。
こちらも微妙な仕様ですが、送ったつもりのメールが送れてなかった時の悲しさと引き換えということで(笑。

ところで、今回プログラムをアップしようとしたときに気付いたのですが、W-ZERO3.org UploaderにUse10Key+SortInchKey+bLaunchでTodayランチャの例という画像をアップして下さっている方がいらっしゃいました。
実はまだSortInchKeyを使った事がなかったのですが、なかなか便利そうなのでマネさせて頂きますね。

2008年01月22日

サスペンド中の電話着信 その2

電話着信があったときに Denwa.exeに飛んでくるメッセージを調べてみました。

メッセージ WPARAM LPARAM
電話着信 WM_USER + 562 0xCA 0x00
:
謎? WM_USER + 562 0xD0 0x00
:
通話ボタン WM_USER + 562 0x1C3 0x00
:
WM_USER + 562 0xCB 0x00
WM_COMMAND 0x8007 0x00
:
切断ボタン WM_USER + 562 0x1C2 0x00
WM_COMMAND 0x8045 0x00
WM_USER + 562 0xCD 0x00
WM_USER + 562 0xCF 0x00
WM_COMMAND 0x8008 0x00
:
WM_COMMAND 0x8004 0x00
:
WM_COMMAND 0x8004 0x00
WM_COMMAND 0x8004 0x00
電話終了 WM_USER + 16390 0x00 0x00

通話ボタンを押す前に相手が電話を切った場合や 相手が先に通話を切った場合は微妙にメッセージが違いますが、電話着信とその後の謎(?)の部分、電話終了については常に同じメッセージが飛んできているようです。

先日からのサスペンド中の電話着信の問題を回避するために、それぞれのタイミングで SetSystemPowerState()を呼んでみたのですが、やはり電話が切断されるとすぐにサスペンド状態に復帰してしまいます。
このタイミングでは RfLedRestrictorがLEDを消す事ができない上に、電話アプリ自体も終了できてないために新たな電話着信があると電話に出ることができないばかりか 一切の操作を受け付けなくなり電池を外して電源を切るしかできなくなるようです。

今のところの回避策は電話を受けた後は一度サスペンドを解除して電話アプリを完全に終了させる(Today画面に復帰する)か、そもそもサスペンドを使わずに画面オフだけを使うしか方法がありません。 Use10Keyのサスペンド機能を利用している場合はご注意ください。

でも、[設定]-[システム]-[パワーマネジメント]で指定した時間が経過してサスペンドに移行した状態だと電話終了後もサスペンド状態に戻ることはありません。
もしかしたら、このあたりに解決のヒントがあるのかもしれませんね。

2007年12月23日

Use10Key更新

「本来の機能からの脱線が大きくなりすぎてきたのでこの辺で...」と言った舌の根も乾かないうちに Use10Keyを更新しました。
  • (削除) up0865.zip (削除ここまで)
  • (削除) up0867.zip (削除ここまで)
    (12/23 23:30追記)
    電話アプリが見つからなかった場合の再試行時にバグがあったので修正しました。
  • up0871.zip
    (12/24追記)
    v0.8の対応が不完全だったので再度修正しました。

1つ目はバグ修正。
/klsuspend /klforcetを指定した状態でサスペンド対象外のアプリが起動していたためにサスペンドせず画面オフになった場合、/klforcetが有効になっていませんでした。

2つ目はサスペンド対象外のアプリを設定ファイルで指定できるようにしました。
Use10Keyと同じフォルダに Use10KeyConfig.xmltという名前のファイルを作成しサスペンド対象外にしたいアプリのクラス名を指定してください。
<?xml version="1.0" encoding="utf-8"?>
<use10key>
 <donotsuspend>
 <app classname="WMP for Mobile Devices" />
 <app classname="TCPMP_Win" />
 <app classname="wCorePlayer" />
 <app classname="OpWindow" />
 <app classname="WCE_NetFront" />
 <app classname="AfxFrameOrView42u" />
 <app classname="IExplore" />
 </donotsuspend>
</use10key>

これで問題が無いようなら、今度こそ脱線しすぎたのでこの辺で...。

2007年12月22日

Use10Key更新

Velmyさんから Use10Keyにコードを提供して頂きました。
リトライ回数を10回にし、それでも失敗した場合にはリトライするかをダイアログで選択できるようにしました。 また、いくつかのアプリが立ち上がっているときは画面OFFだけでサスペンドしないようにしました。 あとは、/force が実装できれば、自分的には完璧なんですけどw http://w-zero3.org/uploader/src/up0862.zip

実はリトライ回数はW-ZERO3.org Uploaderに投げたままになっていたテスト版でも指定できるようにしていました。
 例) 2秒間隔で 10秒間 電話アプリを検索。
 Use10Key.exe /w 10 /i 2

でも、再試行の確認をしてくれる方が親切ですね。
という訳で同じように確認ダイアログを表示するように変更させて頂きました。

最新版をW-ZERO3.org Uploaderにアップしておきます。
画面オフについてもテスト版以降でオプションを追加していました。
 例) キーロックスイッチで画面オフ
 Use10Key.exe /klscreenoff

画面オフにしたときに無線LANやパケット通信を切断するか残しておくかで迷っていましたが、現状では(自分の使い勝手を優先して)切断していません。

起動しているアプリのチェックについてはVelmyさんのコードをそのまま頂きました。
/klsuspendオプションに/appcheckオプションを追加することで、特定のアプリが起動している場合はサスペンドせずに画面を切ります。
 例)以下のアプリが起動している場合はサスペンドせずに画面オフ
 ・メディアプレイヤー
 ・TCPMP
 ・CorePlayer
 ・Opera
 ・ネフロ4.3TP
 ・ネフロ3.3
 ・インターネットエクスプローラ
 
 Use10Key.exe /klsuspend /appcheck

「あとは、/force が実装できれば、自分的には完璧」とのコメントを頂いていたので、作りかけだった/force相当のオプションを見直してみました。
終話キーを連打したりしない限りはそれっぽく動いているのではないかと思います。
 例)
 Use10Key.exe /klscreenoff /klforce

他にもチェックするアプリを指定できるようにすればいいかとも思ったのですが、本来の機能からの脱線が大きくなりすぎてきたのでこの辺で...。

2007年11月24日

Use10Key更新

以前からスタートアップにUse10Keyのショートカットを入れても有効にならないという連絡を頂いていたのですが 自分の環境では再現できず修正できないままになっていました。

ところがさっき 2chのソフトスレを見ていると気になる書き込みを発見。
107 名前: 白ロムさん [sage] 投稿日: 2007年11月24日(土) 05:35:27 ID:wGgeyp/a0 use10keyスタートアップにいれててもテンキー効いちゃうことがあるな で改めて起動しようとすると常駐解除になってるし RfLedRestrictorも今通信きれてるのにLEDがチカチカ点滅してていまいちよくわからんな
116 名前: 白ロムさん [sage] 投稿日: 2007年11月24日(土) 12:22:56 ID:EHfzeIyc0>>107 ソースを見た感じだと、denwa.exeが起動してウィンドウを作成する前に Use10Keyが起動するとまずいっぽい。

確かにコードを見てみると FindWindowに失敗したときに何もできないまま常駐しようとしていますね。
「さすがにこれは無いな」ということで、起動時のチェックを追加しました。

起動時に電話アプリが見つからなかった場合、 念のため3回再試行してからそれでも見つからなければエラーメッセージを表示して常駐せずに終了します。

ただ、自分の環境で10回ほど再起動してみたのですが電話アプリは再試行するまでもなく見つかっているみたいです。
何か他のアプリとの兼ね合いがあるのかもしれませんね。

2007年11月18日

Use10Key更新

先日キーロックスイッチによるサスペンド機能を追加したUse10Keyですが、 inahoさんから「マナーモードや運転モードのときもサスペンドします」とのご指摘を頂きました。

キーフック系のAPIをよくわかってないので 電話アプリに飛んでくるメッセージを捕まえてキーロックスイッチの操作を検出していたのですが、 実はマナーモードや運転モードの操作でも同じメッセージが飛んできてたようです。

やはり手を抜くとロクな事がないですね...。

という訳でメッセージが飛んできた時に HKCU\Software\Sharp\PhoneStatus\Status0を見てキーロックされたのかどうかを判定するように変更してみました。

ただ サスペンド機能は Use10Keyの趣旨とは違ってきているので、ちゃんとした方法で実装した方がいいのかもしれませんね。

2007年11月17日

サスペンド前に少しだけ待機

RfLedRestrictor使用中にKeyLockSuspenderを使って強制サスペンドさせると LEDが点灯したままになってしまいました。
RfLedRestrictor側でサスペンド移行前に何か処理をすることは難しそうなので、 サスペンドさせる側で少し待機させるようなアプローチが必要になります。

本当はKeyLockSuspenderと同じようなものを作ってみたかったのですが、 キーフック系は自分には未知の領域だったりするので 手っ取り早くUse10Keyに機能を追加してキーロックスイッチの操作を検出させてみました。
  • (削除) up0781.zip (削除ここまで)
  • up0784.zip
    (11/18 追記)
    マナーモード、運転モード移行時にもサスペンドしていた問題を修正しました
起動時に"/keylock"オプションを指定することで、キーロックスイッチ操作時にサスペンドに移行します。
サスペンド移行時に無線LANまたはパケット通信中であれば、切断処理を実行したうえでバックライトを消して切断を待ちます。

昨日あたりから「他人のソフトを何のためらいもなくパクるシリーズ(関西の人しかわかりませんね)になっていて心苦しいのですが、 KeyLockSuspenderとの違いとしてパケット通信中だった場合は、通信が切断した後に電波状態が0以上に復帰するまで待機するようにしています。
これで RfLedRestrictorで LEDが点灯したままになる事を避けられるのではないでしょうか。

もちろん その他の機能につては全て KeyLockSuspenderの方が上を行ってますので、 RfLedRestrictorで問題が出てない方には無用の長物ですね。

2007年10月18日

二重起動で常駐解除

Use10Keyを二重起動させることで常駐を解除させたいという要望を頂いたのでプログラムを修正してみました。
例によって W-Zero3 Uploaderにアップしています。

普段はミューテックスを作って二重起動を防いでいました。
hMutex = CreateMutex(NULL, TRUE, USE10KEY_MUTEX_NAME);
if (hMutex) {
 if (ERROR_ALREADY_EXISTS == GetLastError()) {
 // 既に登録されていれば終了する
 CloseHandle(hMutex);
 hMutex = FALSE;
 return FALSE;
 }
} else {
 return FALSE;
}

これを名前付きイベントを使用するように変更してみます。
hEvent = CreateEvent(NULL, FALSE, FALSE, USE10KEY_REMOVE_EVENT);
if (hEvent) {
 if (ERROR_ALREADY_EXISTS == GetLastError()) {
 // 既に登録されていればイベントをシグナル状態にする
 SetEvent(hEvent);
 CloseHandle(hEvent);
 return TRUE;
 }
} else {
 return FALSE;
}
 :
 :
// イベントがシグナル状態になるまで待つ
WaitForSingleObject(hEvent, INFINITE);

これで二重起動させることによって電話アプリを元に戻すことができるようになりました。

その気になれば "Use10KeyRemoveEvent"という名前付きイベントをシグナル状態にすれば他アプリからでも同じことが出来ます(笑

ただ、今のままだとUse10Keyが常駐しているのかどうかが分かりにくいので 何らかのメッセージを表示させた方が分かりやすいかもしれませんね。

2007年10月12日

Today画面でテンキーを使う

遅まきながら PQzIIを使い始めました。
まだまだカスタマイズできていませんが、とても便利なソフトですね。

ところがアドエスは Today画面でテンキーを押すと電話アプリが起動してしまうため、 キーボード収納時には思ったほど使えるキーがありません。

そんなときふと oriさんのブログで他プロセスのウィンドウをサブクラス化していたのを思い出しました。
それなら電話アプリをサブクラス化してメッセージを無視すれば?と思って試しに作ってみたのが、今回の Use10Keyです。
とりあえず動いているような気がするので、v0.1として W-ZERO3.org Uploaderにアップしておきます。
v0.1という自信のないバージョン番号通り、いつにも増してテスト不足です。
本当にちゃんと動いているのかは 皆さんでご判断ください(笑

AltStyle によって変換されたページ (->オリジナル) /