バルーンを消す

ThinkPad無線LANで、(物理)スイッチを切っているときにサスペンド・レジュームすると「ワイアレス ネットワークは利用不可能です。」といちいち教えてくれやがるのだが、タスクバーを左に置いていることもあり、画面の左側が30秒くらい占拠されてしまいとても邪魔だった。(バルーンだけ出てくれればいいのだが、XPだとタスクバー全体がアクティブになってしまう)
Windows XPで通知領域のバルーンヒントを無効にする方法」というのがあるのだが、この方法だと全てのバルーン通知が無効になってしまう。
そいつだけ消したいということでSpy++で見てみたらtooltips_class32というツールチップのクラスだった。
手順としては

  1. EnumWindowsでウィンドウを列挙
  2. コールバック内で、GetClassNameがtooltips_class32で
  3. かつGetWindowLong(GWL_STYLE)でWS_VISIBLEがセットされていた場合
  4. SendMessage(WM_GETTEXT)でメッセージを取得して
  5. 文字列を比較して、消したいメッセージであれば
  6. PostMessage(TTM_POP)で消す

という感じで消すことができた。


最初GetWindowTextを使っていて文字列が取得できずにはまった。GetWindowTextで取得できるのは同じプロセスか、あるいは別プロセスのウィンドウタイトルのみで、別プロセスのコントロールのテキストはWM_GETTEXTを使うとのこと。ローカルのヘルプがWindows Mobileのものになっていたおかげで気づくのが遅れた。
また、TTM_GET系のメッセージもTTM_GETTOOLCOUNT以外は軒並み失敗するのだが、これも別プロセスだからだろうか。