xreaad
[ FrontPage | リロード ] [ 新規 | 一覧 | 検索 | ヘルプ | 更新履歴 ]
[ 編集 | 差分 | ソース ]

駄文 > タスクトレイのアイコン列挙方法 - アイコンの取得は無理

目次

アイコンの取得は無理

[編集]

TrayExpandyawexでその手法を利用しているせいかたまにこういう質問が来るが
はっきり言って、完璧かつどんな時でもタスクトレイのアイコン(以下トレイアイコン)を取得する方法はない

実際ここに書いてある方法も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
基本やね
TB_BUTTONCOUNT
トレイアイコンの数取得
TB_GETBUTTON
トレイアイコンの情報取得、インデックスで指定可能
TB_GETBUTTONINFO
トレイアイコンの詳細情報(?)取得、IDで指定可能

大筋は次のようになる、エラー処理とかややこしいのは省略

 トレイアイコン数 = 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同梱)

そもそもそんな必要あるの

[編集]

なんでトレイアイコンの列挙や他人のアプリのトレイアイコン操作なんてしたいの?
本当にする必要があるの?
ちゃんと仕様は検討した?


この記事は役にたちましたか?

いいえ3
さっぱり5
全然2
時間を無駄にした3
<< 2006-07-30 (Sun) 02:41:38 2006-08-05 (Sat) 22:09:39

Valid XHTML 1.1
Creative Commons License This work is licensed under a Creative Commons License