objective-cをちょい研究!ブログ -35ページ目

objective-cをちょい研究!ブログ

WILLCOMを卒業してiOS開発者に転身しました。。
コメント&トラックバック大歓迎です。

一挙に3つのソフトを紹介してもらいました。
通話ブル、MenuChanger、エスメロディキーボード


X01HTの日記さんありがとうございますm(_._)m

http://d.hatena.ne.jp/wiitomo/20080508
http://d.hatena.ne.jp/wiitomo/20080507
(X01HTの日記さん)


最近WindowsCE FANにもソフト登録したので、昨日のアクセス数が初の1000突破(アクセス者数は420)\(^^)/
ブログを初めて3ヶ月、まだまだアクセス数が気になります(^^;;;

ウィルコムのW-SIMジャケットで欠番だった015番ですが、WS015SHという名前でブルートゥースの認証を通過したらしい。ちなみに、014はPCカードアダプタのWS014IN、016は今話題のAtom端末「D4」。


http://memn0ck.com/blog/2008/05/willcomws015sws016shwzero3d4bluetooth.html

(memn0ck.comさん)


アドエスの電池もくたびれてきたので、そろそろ乗り換えたいところ。
かといってD4はもう電話機じゃないし、10万もするし、重さ500gは携帯2台+アドエス持ちには辛い(>_<)
D4のマイナーチェンジ版な気もしないでもないが、D4発表時に「WS015にあたる端末を企画中」(ケータイwatch)と言っていたので、ZERO3系の新機種ならいいな。

バージョンアップ済みです。最新版をダウンロードしてください。


通話開始をバイブでお知らせするアプリです。

XITの出たブルみたいなものです。


LZHファイルを解凍して、ファイルを好きなフォルダに置いて実行して下さい。

http://www.ne.jp/asahi/phs/phs/blog/tuwaburu.lzh  


100ms単位で0,1を指定してバイブパターンが設定できます。


画面の通話時間表示開始と同じくらいにバイブするんですが、時間表示が遅めなので、あまり実用的じゃないかも(^^;


ソフトの原理です。


タイマーでレジストリのLockPhoneを監視。131073なら発信中である。

LockPhoneが262145なら通話中なので、切り替ったタイミングでバイブを制御する。

HKEY_CURRENT_USER\Software\Sharp\PhoneApp


ただ、この値が切り替るのが通話開始から若干遅れて変更されてるっぽい。

こんなのが作れる人がうらやましい。
http://novi.10.dtiblog.com/blog-entry-239.html
(novi's Blogさん)


W-SIMをiPodに接続できるアダプタを試作されてるみたいです。W-SIMの収納ケースにMINTIAというお菓子の箱を使っていて、外見もすっきりしていて市販品かと思うくらいです。
1000円くらいで作ってくれるらしいので、自分も使ってみたいけど、その前にiPodが無かったり(^^;;;

Operaとかはメニューの階層が深いのでなんとかカスタマイズできないかってことで、他アプリのメニュー操作を調査してみました。
調査もかねてメニューカスタマイズツールを作ってみました。
直接メニューをいじるソフトなんで当面は非公開ですが、自己責任でもし使ってみたい人がいたらメール下さい(WM6用です)。
カスタマイズしても設定を保存できないのであくまで調査・解析用です。

さて、なんか便利そうなアプリは作れるかな。アイデアあったら教えて下さい(^^;;;


何ができるかって言うと、起動中のアプリケーション名を選択(またはクラス名を指定)して


(1)左右メニューの名称とID一覧を取得できます。
(2)メニュー名とIDを指定してメニューの追加ができます。
(3)メニュー名を指定してメニューの削除ができます。
(4)メニュー名を置換できます。
(5)チェックの反転ができます。(ON→OFF / OFF→ON)


MenuChanger


こんな感じに変更できます。
電卓

他アプリのメニュー取得、まる2日がかりでものすごい大変でした(^^;

メニューの取得の方法の大まかな流れです。


(1)SHFindMenuBarでメニューハンドルを取得する
Dim hMenu As IntPtr = SHFindMenuBar(hWnd)


(2)メニューにTB_GETBUTTONメッセージを投げて左右のメニュー情報を取得する
左:SendMessage(hMenu, TB_GETBUTTON, 0, TBBUTTON構造体ポインタ)
右:SendMessage(hMenu, TB_GETBUTTON, 1, TBBUTTON構造体ポインタ)


サブメニューハンドルが取れる
hSubMenu = TBBUTTONのdwData


(3)GetMenuItemInfoで各メニューを取得する
GetMenuItemInfo(hSubMenu, uItem, fByPosition, MENUITEMINFO構造体ポインタ)


戻ってきたMENUITEMINFOより、IDやメニュー名、サブメニューハンドルが取得できる


流れ的にはこれだけで、自分のメニューを取る分には問題なかったんですが、他のアプリにSendMessageでポインタを渡してあげても受け付けてくれない。
CreateFileMappingとMapViewOfFileで他アプリと共有できるメモリを割当てて、それをポインタとして割当ててあげないとだめでした。


(2)の場合こんな感じ
Dim tbb As New TBBUTTON
Dim hFileMapping As IntPtr = CreateFileMapping(&HFFFFFFFF, IntPtr.Zero, PAGE_READWRITE, 0, Marshal.SizeOf(tbb), IntPtr.Zero)
Dim memTBtn As IntPtr = MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0)
SendMessage(hMenu, TB_GETBUTTON, 0, memTBtn.ToInt32)
tbb = Marshal.PtrToStructure(memTBtn, GetType(TBBUTTON))
UnmapViewOfFile(memTBtn)
CloseHandle(hFileMapping)


ソフトキーの名称をとるのにまた一苦労。TBBUTTONのiStringに文字列のハンドルが帰ってくるんですが、これがまた他プロセスのポインタなのでそのまま使えない。
他アプリのウインドウハンドルでプロセスIDを取得して・・・↓な感じです(^^;

Dim intRdCnt As Integer
Dim memStr As IntPtr = LocalAlloc(LMEM_FIXED Or LMEM_ZEROINIT, 256)
GetWindowThreadProcessId(hWnd, intPID)
Dim hProc As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, intPID)
ReadProcessMemory(hProc, tbb.iString, memStr, 256, intRdCnt)
dim iString as String = Marshal.PtrToStringUni(memStr)
LocalFree(memStr)
CloseHandle(hProc)


iStringにソフトキー名が入ります。


ソフトキー名を取ることはできたけど、ソフトキー名を変更するのはいろいろやってみたけど断念です。
TB_DELETEBUTTONでソフトキーメニューを削除して、TB_ADDBUTTONSで再度追加をしてみたけど追加されない…