タスクトレイアイコンのTrapいくつか
いわゆるWindowsのタスクトレイアイコンを扱うときに気をつけないといけないこと。
- エクスプローラが落ちて再起動したとき対策
Platform SDKドキュメント「Windows Shell API/Taskbar」のページの「Taskbar Creation Notification」項に書いてあるが、その場合システムグローバルに「TaskbarCreated」という名前のメッセージが飛ぶ。
プログラム起動時にRegisterWindowMessage()でメッセージIDを拾っておいて、ウインドウプロシージャで捕まえてアイコン再登録すればOK。
- Shell_NotifyIcon()がタイムアウトでこける場合対策
MSKB 418138参照。XP(以降? )では4秒間シェルから応答がないと失敗する。……が、行儀の悪いプログラムがスタートアップシーケンスに居座ってるとそーゆーことは簡単に発生するわけでorz
NIM_ADD発行して(GetLastError()の結果)ERROR_TIMEOUTが返ってきたら、ちょっと待ってNIM_MODIFY試して、だめならNIM_ADD再発行、とするのがお作法ぽい。(無論何度やってもだめならあきらめる処理も要るわな)
- アイコンにメニューつけるときのお約束
MSKB 135788参照。(自動翻訳がわやなのであえて英語ページへリンク)
まず、クリックされたらアイコンの「持ち主」のウインドウをSetForegroundWindow(hWnd)。
そしてアイコンのウインドウメッセージを処理したらPostMessage(hWnd, WM_NULL, 0, 0)。
これやっとかないとメニューが消えなかったり、二回目以降のクリックでメニューが出たと思ったら消えたり、とスカタンな挙動をするorz
そういえばJava6はタスクトレイアイコンサポートしてるらしいがこの辺大丈夫かな。(よー検証せんので誰かよろしく)