2008年03月01日
「Windows Mobileプログラミング徹底理解」買ってきました
ホーミンさんとOffisnailさんがお書きになられた「Windows Mobileプログラミング徹底理解」を買ってきました.休日はこれを読んで勉強するです.
イヤホンマイクの通話スイッチの隠し?機能
イヤホンマイクの通話スイッチに関してですが,隠し?機能があるみたいですね.
HKEY_LOCAL_MACHINE\System\Drivers\BuiltIn\WaveDev\ShConfigにScShotModeというDWORD値を作成して,値を1にセットすると,その機能が有効になります.(変更を反映するにはソフトリセットが必要)
通常,イヤホンマイクの通話ボタンを押すと本体の通話ボタンと同じ動きをしますが,この機能を有効にするとイヤホンマイクの通話ボタンを押下でスクリーンショットを取るようになります.(WS003SHで確認)
何のためにこんな機能を仕込んであるんだろう...
HKEY_LOCAL_MACHINE\System\Drivers\BuiltIn\WaveDev\ShConfigにScShotModeというDWORD値を作成して,値を1にセットすると,その機能が有効になります.(変更を反映するにはソフトリセットが必要)
通常,イヤホンマイクの通話ボタンを押すと本体の通話ボタンと同じ動きをしますが,この機能を有効にするとイヤホンマイクの通話ボタンを押下でスクリーンショットを取るようになります.(WS003SHで確認)
何のためにこんな機能を仕込んであるんだろう...
2008年02月27日
SendLightMailバグってた
SendLightMail v0.04ですが,多分メモリリークしてます.
ソースを改造している人はshphoneClientlibWrapper.cppの
リークといっても多分3バイトぐらいですし,私のblogで公開しているバイナリを使用している人もほとんどいないと思いますので,修正モジュールはアップしません.
# shphonelib.dllからメッセージで通知されるイベント(送信完了etc)を真面目に調査して下さる方はいないかしら
ソースを改造している人はshphoneClientlibWrapper.cppの
delete m_pInstance;を
delete [] m_pInstance;に直してください.
リークといっても多分3バイトぐらいですし,私のblogで公開しているバイナリを使用している人もほとんどいないと思いますので,修正モジュールはアップしません.
# shphonelib.dllからメッセージで通知されるイベント(送信完了etc)を真面目に調査して下さる方はいないかしら
2008年02月26日
kicklightmail テンプレート対応お試し版
kicklightmailにテンプレートを指定するオプションを追加しました.
adesでは正常に動作しないようなので,お蔵入りとしました.(2008.02.26 21:05)
バイナリとソースはこちら.
kicklightmail_v001tmpl.zip
kicklightmail_v001tmpl_src.zip
kicklightmail 07000000000 template.txt
のように指定して実行すると,宛先は07000000000,本文にtemplate.txtの中身がセットされた状態で,ライトメールアプリが起動します.
(template.txtの文字コードはShiftJIS)
また,従来通り,宛先のみの指定による起動も可能です.
続きを読む
adesでは正常に動作しないようなので,お蔵入りとしました.(2008.02.26 21:05)
kicklightmail_v001tmpl.zip
kicklightmail_v001tmpl_src.zip
kicklightmail 07000000000 template.txt
のように指定して実行すると,宛先は07000000000,本文にtemplate.txtの中身がセットされた状態で,ライトメールアプリが起動します.
(template.txtの文字コードはShiftJIS)
また,従来通り,宛先のみの指定による起動も可能です.
続きを読む
2008年02月24日
ChooseContact()が動かない
ChooseContact()という,連絡先ダイアログを表示してメールアドレス等を選択するためのAPIがあるんですが,コイツがうまく動いてくれません.
下記のような感じでMSDNのサンプルを動かしてみたんですが,エラーになってしまいます.LastError値は87(ERROR_INVALID_PARAMETER).
メジャーなAPIなんでケアレスミスだと思うんですが何でだろう...
eVC4な環境なのでそのままではChooseContact()は使えないので,pimstore.dllをLoadLibrary(), GetProcAddress()しました.
それがまずいのかと思ってWM5SDKのpimstore.libを引っこ抜いてリンクしてもNGでした.
下記のような感じでMSDNのサンプルを動かしてみたんですが,エラーになってしまいます.LastError値は87(ERROR_INVALID_PARAMETER).
#include <pimstore.h>
// ...
HRESULT hr = E_FAIL;
CHOOSECONTACT cc = {0};
cc.cbSize = sizeof (cc);
cc.dwFlags = CCF_RETURNCONTACTNAME | CCF_HIDENEW;
// 連絡先の選択ダイアログを表示する
hr = ChooseContact(&cc);
// 選択した名前を表示する
MessageBox(NULL, cc.bstrContactName, TEXT("Selected Contact"), MB_OK);
// メモリを解放する
SysFreeString(cc.bstrContactName);
メジャーなAPIなんでケアレスミスだと思うんですが何でだろう...
eVC4な環境なのでそのままではChooseContact()は使えないので,pimstore.dllをLoadLibrary(), GetProcAddress()しました.
それがまずいのかと思ってWM5SDKのpimstore.libを引っこ抜いてリンクしてもNGでした.
seesaaイマイチですね
blogというものを始めて半年くらいなので何ともいえないのですが,seesaaのblogサービスはイマイチな気がします.
コメント数が異常な数になったり(コメントを追加したのにコメント数が減るって何なのだわ),受けたトラックバックが数週間反映されなかったり...
はてなとかFC2とかの他のサービスはどんな感じなんでしょう?
コメント数が異常な数になったり(コメントを追加したのにコメント数が減るって何なのだわ),受けたトラックバックが数週間反映されなかったり...
はてなとかFC2とかの他のサービスはどんな感じなんでしょう?
2008年02月13日
IrisBrowser
ibis browserの誤字じゃないです.
W-ZERO3ツールMEMOさんのこのエントリからの情報なのですが,IrisBrowserという新しいブラウザが出てきているようです.
早速,私の003SHにインストールしてみましたが,結果はツールMEMOさんの所にも書いてある通り起動しませんでした.Windows Mobile version 6 (Pro, Smartphone)向けらしいので,当たり前といえば当たり前なんですが...
ここで完結しては面白くありません.せっかくだから,無理やり動かしてみます.
とりあえず,起動しない原因は以下の2点にあるようです.
(1) PhoneMakeCall()を使用するためにphone.dllをリンクしているが,w-zero3にはこのDLLがない.
(2) exe, dllのsubsystemが5.02になっているため,WM6以上でないと起動できない.ad[es]ならWM6であるため,この問題は発生しない.
(1)に関しては,dummyのphone.dllをでっちあげてexeを同じディレクトリに置けば良い筈.
(2)は母艦にexeとdllを持ってきて,editbin /subsystem:windowsce,5.01 xxxxxを実行して,subsystemを5.01に変更すればOK.(PEのchecksumが0になっちゃうけどキニシナイ)
上記の2つを行って,IrisBrowserが起動できることは確認しました.
使用したdummyのphone.dllを置いておきます.
ad[es]なら,これをIrisBrowserと同じディレクトリにコピーするだけで,起動できるようになるはずです.
phone_dummy.zip
phone_dummy_src.zip
W-ZERO3ツールMEMOさんのこのエントリからの情報なのですが,IrisBrowserという新しいブラウザが出てきているようです.
早速,私の003SHにインストールしてみましたが,結果はツールMEMOさんの所にも書いてある通り起動しませんでした.Windows Mobile version 6 (Pro, Smartphone)向けらしいので,当たり前といえば当たり前なんですが...
ここで完結しては面白くありません.せっかくだから,無理やり動かしてみます.
とりあえず,起動しない原因は以下の2点にあるようです.
(1) PhoneMakeCall()を使用するためにphone.dllをリンクしているが,w-zero3にはこのDLLがない.
(2) exe, dllのsubsystemが5.02になっているため,WM6以上でないと起動できない.ad[es]ならWM6であるため,この問題は発生しない.
(1)に関しては,dummyのphone.dllをでっちあげてexeを同じディレクトリに置けば良い筈.
(2)は母艦にexeとdllを持ってきて,editbin /subsystem:windowsce,5.01 xxxxxを実行して,subsystemを5.01に変更すればOK.(PEのchecksumが0になっちゃうけどキニシナイ)
上記の2つを行って,IrisBrowserが起動できることは確認しました.
使用したdummyのphone.dllを置いておきます.
ad[es]なら,これをIrisBrowserと同じディレクトリにコピーするだけで,起動できるようになるはずです.
phone_dummy.zip
phone_dummy_src.zip
2008年02月04日
「画像とビデオ」で1つ上のディレクトリに移動
標準の「画像とビデオ」ですが,esやad[es]ではクリアキーで1つ上のディレクトリに移動できるようです.
また,「画像とビデオ」 自分用プチ快適化 を参考にすると,004SHではバックスペースキーで同じ動きをするようです.
しかしながら,私の003SHではバックスペースをいくら押しても1つ上のディレクトリに移動してくれません.私の環境がおかしいのか,AKUの違いによるものなのか切り分けるのも面倒だったので,アプリを作って解決しました.
pimgdirup.zip
pimgdirup_src.zip
「画像とビデオ」が最前面にある時にpimgdirup.exeを実行すると,1つ上にディレクトリに移動します.
pimgdirup.exeは,W-ZERO3 Utility PlusやSortInchKeyなどのキー割り当てソフトを使って,左ソフトキーに割り当てて使用することを想定しています.
また,「画像とビデオ」 自分用プチ快適化 を参考にすると,004SHではバックスペースキーで同じ動きをするようです.
しかしながら,私の003SHではバックスペースをいくら押しても1つ上のディレクトリに移動してくれません.私の環境がおかしいのか,AKUの違いによるものなのか切り分けるのも面倒だったので,アプリを作って解決しました.
pimgdirup.zip
pimgdirup_src.zip
「画像とビデオ」が最前面にある時にpimgdirup.exeを実行すると,1つ上にディレクトリに移動します.
pimgdirup.exeは,W-ZERO3 Utility PlusやSortInchKeyなどのキー割り当てソフトを使って,左ソフトキーに割り当てて使用することを想定しています.
2008年01月01日
あけましておめでとうございます
今年こそWS003/004SHの後継機種が発売されますように
2007年12月22日
受話音量の変更
端末が修理から帰ってきたいうことで,リハビリがてらコードを書いてみました.
W-ZERO3の受話音量を変更するだけのアプリです.
SetPhoneVolume.zip
SetPhoneVolume_src.zip
うん.そうだね.役にたたないね.
その上,shphonelib.dllを叩いているだけなので,技術的にも面白くないね.
W-ZERO3の受話音量を変更するだけのアプリです.
SetPhoneVolume.zip
SetPhoneVolume_src.zip
うん.そうだね.役にたたないね.
その上,shphonelib.dllを叩いているだけなので,技術的にも面白くないね.
w-zero3復活
修理に出していたW-ZERO3が戻ってきました.
修理に出した際の説明では,フォーマットでまっさらな状態になる可能性があるとのことだったのですが,実際はフォーマットされずに済んだようです.
というか,Todayを萌え系にしていたので,ウィルコムプラザのおねいさんが私のZERO3を操作している時,とっても羞恥プレイな気分でしたわ.
修理に出した際の説明では,フォーマットでまっさらな状態になる可能性があるとのことだったのですが,実際はフォーマットされずに済んだようです.
というか,Todayを萌え系にしていたので,ウィルコムプラザのおねいさんが私のZERO3を操作している時,とっても羞恥プレイな気分でしたわ.
2007年12月20日
w-zero3壊れたみたい(続き)
故障したW-ZERO3の件ですが,ウィルコムプラザから修理代の見積もりの連絡がありました.
手数料込みで約9k円とのことです.
ちょっと高いのですが,愛着もある機体ですので,修理をお願いしました.
というわけで,ad[es],004SHに買い換える線は無しです.
ad[es]はhackしがいがあって面白そうなんですが,サイズが中途半端な気がして,いまいち食指が動かないっす.
手数料込みで約9k円とのことです.
ちょっと高いのですが,愛着もある機体ですので,修理をお願いしました.
というわけで,ad[es],004SHに買い換える線は無しです.
ad[es]はhackしがいがあって面白そうなんですが,サイズが中途半端な気がして,いまいち食指が動かないっす.
2007年12月12日
w-zero3壊れたみたい
突然,w-zero3(003SH)の電源が入らなくなってしまいました.
リセット,バッテリー接点の掃除などやってみたけど,直らず.
修理に出そうと思いますが,10kを超えるようなら他の端末を買うかも.
候補としては,こんな感じ.
・ad[es]
・004SH
・EM-ONEα
・X01T
・X02HT
主な用途がゲーム,動画,Webなので液晶は大きいほうが良いんですよね.
無印003/004の後継機種が発売されればベストなんですが.
リセット,バッテリー接点の掃除などやってみたけど,直らず.
修理に出そうと思いますが,10kを超えるようなら他の端末を買うかも.
候補としては,こんな感じ.
・ad[es]
・004SH
・EM-ONEα
・X01T
・X02HT
主な用途がゲーム,動画,Webなので液晶は大きいほうが良いんですよね.
無印003/004の後継機種が発売されればベストなんですが.
2007年11月04日
Tasks拡張うまくいかないね
WM5標準の"仕事"アプリっていまいち使い勝手が悪いですね.
かといって,フリーな代替アプリを探しても見つからず...
じゃあ,標準アプリを拡張してやるべ,とコードを書き始めたけれど,そちらも挫折.
(1) アクションキー長押しのコンテクストメニューの拡張
→ リストビューで選択しているものとは違うOIDが取れちゃう
→ ウボァ('A`)
(2) 進捗状況(終了 or 作業中)を変更するために,編集画面まで行かないと変更できない
→ 右ソフトキーのメニューから簡単に変更できるように
→ 変更はできたけど,5秒ぐらい立たないとリストビューへ反映されない
といった所で止まっています.とりあえず,(2)だけ実装したバイナリとソースを置いておきます.
TasksExt_v001.zip
TasksExt_v001_src.zip
5秒ぐらい立たないとリストビューへ反映されないのはそのままです.
(IPOutlookAppのLogin()にウィンドウハンドルを渡してもダメそう)
かといって,フリーな代替アプリを探しても見つからず...
じゃあ,標準アプリを拡張してやるべ,とコードを書き始めたけれど,そちらも挫折.
(1) アクションキー長押しのコンテクストメニューの拡張
→ リストビューで選択しているものとは違うOIDが取れちゃう
→ ウボァ('A`)
(2) 進捗状況(終了 or 作業中)を変更するために,編集画面まで行かないと変更できない
→ 右ソフトキーのメニューから簡単に変更できるように
→ 変更はできたけど,5秒ぐらい立たないとリストビューへ反映されない
といった所で止まっています.とりあえず,(2)だけ実装したバイナリとソースを置いておきます.
TasksExt_v001.zip
TasksExt_v001_src.zip
5秒ぐらい立たないとリストビューへ反映されないのはそのままです.
(IPOutlookAppのLogin()にウィンドウハンドルを渡してもダメそう)
2007年10月18日
W-SIMへのファイルの書き込み
W-SIMへのファイルの書き込みはshphonelib.dllのFT_SendFile()でいけると思います.(未確認ですが)
引数の意味は多分以下の通り.
例としてはこんな感じ.
FT_SendFile(L"Netsetting.dat", L"\\Temp\\Netsetting.dat", 52, L"20071018013730");
ただ,shphonelib.dllには書き込んだファイルを削除する機能は実装されていないみたいなんで,実験するのが難しいんですよね〜
int
FT_SendFile(
LPWSTR pDestFile,
LPWSTR pSrcFile,
unsigned long ulFileSize,
LPWSTR pLocalTimeStr
)
引数の意味は多分以下の通り.
pDestFile : 書き込み先(W-SIM内)のファイル名
pSrcFile : 書き込み元(W-ZERO3のファイルシステム上)のファイルパス
ulFileSize: 書き込むファイルのサイズ
pLocalTimeStr: 書き込み日時の文字列(書式はYYYYMMDDhhmmss)
例としてはこんな感じ.
FT_SendFile(L"Netsetting.dat", L"\\Temp\\Netsetting.dat", 52, L"20071018013730");
ただ,shphonelib.dllには書き込んだファイルを削除する機能は実装されていないみたいなんで,実験するのが難しいんですよね〜
2007年10月14日
W-SIMからのファイルの取得(うまくいったかも)
W-SIMに保存されているファイルの取得に成功しましたので,テストアプリを公開しておきます.
バイナリとソースはこちら.
WSIMFileGet_v001.zip
WSIMFileGet_v001_src.zip
WSIMFileGet_v002.zip
WSIMFileGet_v002_src.zip
WSIMFileGet Netsetting.dat を実行すると,オンラインサインアップ情報が取得できます.
WSIMFileGet Mytelebook.dat で,電話帳データが取得できると思います.(未確認)
W-SIMに保存されているファイルの一覧が知りたい方は,適当にソースをいじってみてください.
電話帳データの調査もしたいんですけど,WS003SHしか所有していないんで無理なんですよね...
(追記) 2007/10/15 0:32
W-SIM内のファイルリストを表示する機能を追加しました.
(追記2) 2007/10/15 23:00
readme.txtの記載に誤記があったため,v002のアーカイブを差し替えました.
バイナリとソースはこちら.
WSIMFileGet_v002.zip
WSIMFileGet_v002_src.zip
WSIMFileGet Netsetting.dat を実行すると,オンラインサインアップ情報が取得できます.
WSIMFileGet Mytelebook.dat で,電話帳データが取得できると思います.(未確認)
W-SIMに保存されているファイルの一覧が知りたい方は,適当にソースをいじってみてください.
電話帳データの調査もしたいんですけど,WS003SHしか所有していないんで無理なんですよね...
(追記) 2007/10/15 0:32
W-SIM内のファイルリストを表示する機能を追加しました.
(追記2) 2007/10/15 23:00
readme.txtの記載に誤記があったため,v002のアーカイブを差し替えました.
2007年10月12日
W-SIMからのファイルの取得(うまくいかず)
オンラインサインアップを行うと,各種設定値はNetsetting.datというファイルとして,W-SIMへ書き込まれます.
W-SIMへのファイルの読み書きはshphonelib.dllの以下のメンバ関数を使用しているみたいです.
int __cdecl CshphoneClientlib::FT_ProcessBegin(void)
void __cdecl CshphoneClientlib::FT_ProcessEnd(void)
int __cdecl CshphoneClientlib::FT_GetFileList(struct WSIMFileList_TAG *)
int __cdecl CshphoneClientlib::FT_RecvFile(wchar_t const *,wchar_t const *,unsigned long)
int __cdecl CshphoneClientlib::FT_SendFile(wchar_t const *,wchar_t const *,unsigned long,wchar_t const *)
FT_GetFileList()でファイルのリストを取得するところまでは成功したんですが,FT_RecvFile()を呼び出すとアプリが落ちちゃいます.
誰かうまくいっている人はいないかな...
(追記) 2007/10/12 23:44
とりあえず,現在までの解析用テストコードを置いておきます.
FileGet.zip
誰か後を引き継いでくれないかしら.
W-SIMへのファイルの読み書きはshphonelib.dllの以下のメンバ関数を使用しているみたいです.
int __cdecl CshphoneClientlib::FT_ProcessBegin(void)
void __cdecl CshphoneClientlib::FT_ProcessEnd(void)
int __cdecl CshphoneClientlib::FT_GetFileList(struct WSIMFileList_TAG *)
int __cdecl CshphoneClientlib::FT_RecvFile(wchar_t const *,wchar_t const *,unsigned long)
int __cdecl CshphoneClientlib::FT_SendFile(wchar_t const *,wchar_t const *,unsigned long,wchar_t const *)
FT_GetFileList()でファイルのリストを取得するところまでは成功したんですが,FT_RecvFile()を呼び出すとアプリが落ちちゃいます.
誰かうまくいっている人はいないかな...
(追記) 2007/10/12 23:44
とりあえず,現在までの解析用テストコードを置いておきます.
FileGet.zip
誰か後を引き継いでくれないかしら.
2007年10月08日
Today画面からの発着信履歴表示(続き2)
一点書き忘れてました.
es, ad[es]持ちのプログラマな方が見ていたら教えてください.
Today画面で左右のキーを押して発信履歴,着信履歴を表示する際に,電話アプリに何かメッセージが飛んでいっていますか?(WM_USER+???)
メッセージが飛んでいってるのならば,wParamとlParamもついでに教えていただけると有り難いです.
es, ad[es]持ちのプログラマな方が見ていたら教えてください.
Today画面で左右のキーを押して発信履歴,着信履歴を表示する際に,電話アプリに何かメッセージが飛んでいっていますか?(WM_USER+???)
メッセージが飛んでいってるのならば,wParamとlParamもついでに教えていただけると有り難いです.
Today画面からの発着信履歴表示(続き)
DesktopExplorerWindowをサブクラス化する方法が実現可能かどうか,検証コードを書いてみました.
Today画面で左右のキーを押すことで発信履歴・着信履歴を表示できるようにするアプリです.
es, ad[es]では標準で可能なため,無印003向けとなります.
バイナリとソースはこちら.
tdCallLogHk.zip
tdCallLogHk_src.zip
あくまでも検証用なため,実用にするのは控えたほうが身の為ですよ.
続きを読む
Today画面で左右のキーを押すことで発信履歴・着信履歴を表示できるようにするアプリです.
es, ad[es]では標準で可能なため,無印003向けとなります.
バイナリとソースはこちら.
tdCallLogHk.zip
tdCallLogHk_src.zip
あくまでも検証用なため,実用にするのは控えたほうが身の為ですよ.
続きを読む
Today画面からの発着信履歴表示
esやAd[es]ではToday画面で左右のキーを押すと,発信履歴,着信履歴が表示されるそうです.
これが,技術的にどのようにして実現されているのか,微妙に気になります.
Today画面で左右のキーを押したら,現在選択されているTodayPluginに左右のキーが押されたことが通知され,そのPlugin内でイベントが処理されるのが普通です.
どのTodayPluginが選択されていたとしても,問答無用でキーイベントを横取りし,自前の処理を行う(この場合 履歴の表示)ためには,かなり特殊なことを行う必要があると思われます.
予想としては2つあります.
■ 予想 1.キーボードドライバ側で特殊な処理を入っている
キーボードドライバ(d2keybd.dll, shkeybd.dll)側に以下のような処理が入っている.
・左右のキーが押されたとき,Today画面表示中ならば,電話アプリへ履歴の表示を要求.
・左右のキーが押されたとき,Today画面表示中でなければ,通常のキーコードを発行.
■ 予想 2. Today画面(DesktopExplorerWindow)のサブクラス化
リモートスパイ++で見ると分かると思いますが,各々のTodayPluginの一行ごとにウィンドウが存在します.
そのウィンドウの親の親の...と遡って,トップレベルウィンドウがDesktopExplorerWindowです.
DesktopExplorerWindowをサブクラス化し,左右のキーが押された・離されたメッセージを独自に処理してしまえば,各子ウィンドウであるTodayPluginへ処理が移らず,希望した内容が実現できます.
多分,予想2.が正解なような気がしますが...
これが,技術的にどのようにして実現されているのか,微妙に気になります.
Today画面で左右のキーを押したら,現在選択されているTodayPluginに左右のキーが押されたことが通知され,そのPlugin内でイベントが処理されるのが普通です.
どのTodayPluginが選択されていたとしても,問答無用でキーイベントを横取りし,自前の処理を行う(この場合 履歴の表示)ためには,かなり特殊なことを行う必要があると思われます.
予想としては2つあります.
■ 予想 1.キーボードドライバ側で特殊な処理を入っている
キーボードドライバ(d2keybd.dll, shkeybd.dll)側に以下のような処理が入っている.
・左右のキーが押されたとき,Today画面表示中ならば,電話アプリへ履歴の表示を要求.
・左右のキーが押されたとき,Today画面表示中でなければ,通常のキーコードを発行.
■ 予想 2. Today画面(DesktopExplorerWindow)のサブクラス化
リモートスパイ++で見ると分かると思いますが,各々のTodayPluginの一行ごとにウィンドウが存在します.
そのウィンドウの親の親の...と遡って,トップレベルウィンドウがDesktopExplorerWindowです.
DesktopExplorerWindowをサブクラス化し,左右のキーが押された・離されたメッセージを独自に処理してしまえば,各子ウィンドウであるTodayPluginへ処理が移らず,希望した内容が実現できます.
多分,予想2.が正解なような気がしますが...