システムトレイはwinicoを使うのが定番だけど、twapiにもシステムトレイにアイコンを追加する機能があるのを見つけたので、忘れないために簡単なサンプルを書いておく。
| ::twapi::load_icon_from_file | ファイルからicoを読み込む |
| ::twapi::load_icon_from_module | DLLやEXEからicoを読み込む |
| ::twapi::load_icon_from_system | システムOEMからicoを読み込む |
| ::twapi::free_icon | アイコンのハンドルを解放 |
マニュアル:http://twapi.sourceforge.net/resource.html
| ::twapi::systemtray addicon | システムトレイにアイコン追加。idを返す |
| ::twapi::systemtray modifyicon | idのパラメータ(アイコンとか)を変更 |
| ::twapi::systemtray removeicon | システムトレイから削除 |
マニュアル:http://twapi.sourceforge.net/shell.html
これだけ。引数のパラメータや定数はresource.tcl、shell.tclを読むこと。 アイコンをロードして、そのアイコンのハンドルをsystemtrayでaddiconするだけのようだ。
クリックでアイコンの切り替え、ダブルクリックでメッセージ表示、右クリックでコンテキストメニューの表示。
package require Tk
package require twapi
set state 1
set ico1 [twapi::load_icon_from_system INFORMATION]
set ico2 [twapi::load_icon_from_system WARNING]
proc ico_hook {id type loc time} {
puts $id,$type,$loc,$time
switch $type {
lbuttonup {
switch_state
update_systemtray $id
}
lbuttondblclk {
tk_messageBox -message "Ouch!"
}
contextmenu {
$::popup post {*}$loc
}
}
}
proc quit {id} {
twapi::systemtray removeicon $id
exit
}
proc switch_state {} {
if {$::state == 1} {
set ::state 2
} else {
set ::state 1
}
}
proc update_systemtray {id} {
twapi::systemtray modifyicon $id -hicon [set ::ico$::state]
}
wm withdraw .
set id [twapi::systemtray addicon $ico1 ico_hook]
update_systemtray $id
set ::popup [menu .popup -tearoff 0]
$::popup add command -label "Exit" -command {
quit $id
}