TrayExpandやyawexでその手法を利用しているせいかたまにこういう質問が来るが
はっきり言って、完璧かつどんな時でもタスクトレイのアイコン(以下トレイアイコン)を取得する方法はない
実際ここに書いてある方法もWindows2000、XPのみしか動作しない上に何件か不具合報告などが寄せられている
サービスパックやその他システムの様々な状態によって動作しないかもしれないのでその辺注意してね
まずタスクトレイの構成を知っておくこと
Windowsのバージョンによって微妙に変わっているが、この手法事態2000とXPしか使えないのでそれ以外は知らなくてもいい
VisualStudio等がある人は付属ツールのSpy++を利用するとよい
他にはTClockの作者、Kazubon氏がまとめた「タスクバーとスタートメニューの歴史」が図解入りで分かりやすいかも
http://homepage1.nifty.com/kazubon/progdoc/tclock/taskbarhistory.html
タスクトレイはToolbarWindow32、つまりツールバーでできていると言うことが分かる
ツールバーであれば項目数の取得や情報取得などのメッセージが利用できる可能性が高い
WindowsSDKで利用するメッセージについて把握しておくとよい
TB_ で始まるメッセージを利用する、MSDNなどで調べればよい
前準備としてはそんなところ
ツールバーの情報取得とほぼ同じように進めていけばいい
C言語での手法とサンプルを提示する
必要になるAPI、メッセージはこんな所
大筋は次のようになる、エラー処理とかややこしいのは省略
トレイアイコン数 = SendMessage(タスクトレイHWND, TB_BUTTONCOUNT, ...);
for(i = 0; i < トレイアイコン数; i++)
{
SendMessage(タスクトレイHWND, TB_GETBUTTON, i, トレイアイコンの情報を受け取る);
SendMessage(タスクトレイHWND, TB_GETBUTTONINFO, トレイアイコン情報のID, トレイアイコンの詳細情報を受け取る);
// ここ以降で詳細情報を使って処理をする
}
問題は詳細情報だが、これは単なるメモリアドレスになる
情報の内容自体はあてずっぽと経験で解析している
実際のソースを提示しておくので参照して欲しい、ソース中ではTRAYNOTIFY構造体で表している
http://qwerty.s2.xrea.com/data/te_core.lzh
(cygwin-gccがあるとなおよい、GCC用のMakefile同梱)
なんでトレイアイコンの列挙や他人のアプリのトレイアイコン操作なんてしたいの?
本当にする必要があるの?
ちゃんと仕様は検討した?
この記事は役にたちましたか?