goo

タスクトレイアイコンの作成

◆一覧リスト
HSP Ver3.0
HSP Ver2.61
ブログ関連
その他
★人気blogランキング

「タスクトレイアイコンの作成」

タスクトレイアイコンの作成
SHELL32.DLLの「Shell_NotifyIcon」関数を使用する事で、
タスクトレイに追加、変更、削除が可能となります。

Shell_NotifyIcon dwMessage , lpdata

動作環境
shell32.dll version 4.0以上
Windows NT 4.0, Windows 95以上
第一引数 dwMessage: 以下数値のどれか
NIM_ADD (0x00)
タスクトレイにアイコンを追加します。
NIM_MODIFY (0x01)
設定を変更します
NIM_DELETE (0x02)
タスクトレイのアイコンを削除します。
NIM_SETFOCUS (0x03)
タスクトレイにフォーカス(※Ver5以上)
NIM_SETVERSION (0x04)
バージョンの変更をします(※Ver5以上)
デフォルトのバージョンはVer4
バルーンチップの利用時等に使用
第二引数 NOTIFYICONDATA 構造体のポインタ
cbSize (4byte)
構造体のサイズ
Ver4:88バイト Ver5:488バイト Ver6:504バイト
hWnd (4byte)
親ウィンドウを必ず指定
uID (4byte)
アイコンの識別子
複数のアイコンを登録できるのでそれを区別する為の任意の数値を指定します
uFlags (4byte)
どれを有効とするか指定します
複数指定可能
NIF_ICON 0x0002
アイコンを指定
NIF_MESSAGE 0x0001
上記親ウィンドウのプロシージャに送られてくるメッセージを任意に指定
NIF_TIP 0x0004
アイコン上にマウスがある時のツール-チップに表示する文字列を指定
NIF_STATE 0x0008
アイコンのステータス(表示、非表示)を指定
NIF_INFO 0x0010
バルーンツールチップを指定
NIF_GUID 0x0020
使用しません
uCallbackMessage (4byte)
ウィンドウに送られるメッセージの数値(任意)を指定します
タスクトレイアイコンをクリックした時等にこのメッセージが送られます
「oncmd」でここで指定した数値を指定します
hIcon (4byte)
アイコンのハンドルを指定
※uFlagsでNIF_ICONを指定しなければいけません
szTip (4byte)
ツールチップに表示させる文字列変数のポインタを指定
サイズは、Ver4:64byte Ver5以降:128byte
※uFlagsでNIF_TIPを指定しなければいけません

Ver 4はここまで
dwState (4byte)
アイコンの状態を変更します
NIS_HIDDEN 1
アイコン非表示
NIS_SHAREDICON 2
アイコン共有
※uFlagsでNIF_STATEを指定しなければいけません
dwStateMask
マスクを指定
szInfo
バルーンツールチップに表示させる文字列変数のポインタを指定
サイズは256byte
※uFlagsでNIF_INFOを指定しなければいけません
uTimeout
一つのバルーンツールチップしか表示しないので
次に表示するまでのタイムアップをms単位で指定。
※uTimeoutかuVersionのどちらかを指定する事
uVersion
バージョンを指定
※uFlagsでNIM_SETVERSIONを指定しなければいけません
※uTimeoutかuVersionのどちらかを指定する事
szInfoTitle
バルーンツールチップのタイトル名の文字変数のポインタを指定
サイズは、64byte
dwInfoFlags
バルーンツールチップに表示されるアイコンの種類の数値を指定
NIIF_ERROR 0x0003
エラーアイコン ※Ver 5,6
NIIF_INFO 0x0001
情報アイコン ※Ver 5,6
NIIF_NONE 0x0000
アイコン非表示 ※Ver 5,6
NIIF_WARNING 0x0002
ワーニングアイコン ※Ver 5,6
NIIF_ICON_MASK 0x000f
使用しません ※Ver 6
NIIF_NOSOUND 0x0010
サウンド無効 ※Ver 6

Ver 5はここまで
guidItem (16byte)
指定しません

Ver 6はここまで

タスクトレイアイコンからメニューの表示
タスクトレイからのメニュー表示で、
気をつけないといけない点がいくつかあります。
  1. メニューを表示する前に
    「SetForegroundWindow」で親ウィンドウをアクティブにすること
    しない場合、親ウィンドウ、メニューを選択するまでメニューが消えません。
    以下サンプルでは、タスクトレイ用の非表示ウィンドウを親ウィンドウとしています。
  2. メニューの表示終了後、「WM_NULL」をポストすること
    しない場合、メニューが表示されないことがあります。
【参考リンク】
MSサポート技術情報 文書番号 : 135788
メニュー表示について
※日本語での説明ですが、翻訳がおかしい部分があるので
英語版のほうを参照したほうがいいかもしれません。
MSサポート技術情報 文書番号 : 418138
タスクトレイにアイコンが表示されない時
◆サンプル
  1. WM_TIMERを使用して、3秒毎にshell32.dll内のアイコンを順番に表示しています。
    システムアイコンを利用しているので、メモリ解放はしていません。
    ※通常アイコンを使用する場合解放を忘れるとメモリリークの原因になりますが、
    システムで使用しているものを解放するとシステムが不安定になる事があるからです。
  2. クライアントエリアまたはタスクトレイアイコンを右クリックすることでメニューを表示します。
    クライアントエリアの色変更と終了が可能です。
サンプル
////////////////////////////////////////////////////////////////////////////////////
//関数登録
#uselib "Shell32.dll"
	#cfunc ExtractIcon "ExtractIconA" int,sptr,int
	#cfunc Shell_NotifyIcon "Shell_NotifyIcon" int,var

#uselib "user32.dll" 
	#cfunc CreatePopupMenu "CreatePopupMenu"
	#func InsertMenu "InsertMenuA" int,int,int,int,sptr
	#func TrackPopupMenu "TrackPopupMenu" int,int,int,int,int,int,int
	#func DestroyMenu "DestroyMenu" int
	#func SetForegroundWindow "SetForegroundWindow" int
	#func PostMessage "PostMessageA" int,int,int,int
	#func SetTimer "SetTimer" int,int,int,sptr
	#func KillTimer "KillTimer" int,int


////////////////////////////////////////////////////////////////////////////////////
//定義
#define ICON_FILE	dir_sys+"\\shell32.dll"

#define WM_CLOSE		0x0010	//メッセージ:ソフト終了時
#define WM_RBUTTONDOWN	0x0204	//メッセージ:マウス右ボタンクリック
#define WM_COMMAND		0x0111	//メッセージ:COMMAND
#define WM_TIMER		0x0113	//メッセージ:タイマー
#define WM_NULL		0x0000	//メッセージ:NULL

#define NM_TRAYICON	0x5000	//メッセージ:トレイアイコン

#define ID_TRAYICON	0x1000	//トレイアイコンの識別子
#define NIF_MESSAGE	0x01	//フラグ:メッセージの設定
#define NIF_ICON		0x02	//フラグ:アイコンの設定
#define NIF_TIP		0x04	//フラグ:ツールチップの設定
#define NIM_ADD		0x00	//タスクトレイに追加
#define NIM_MODIFY		0x01	//タスクトレイの変更
#define NIM_DELETE		0x02	//タスクトレイから削除

////////////////////////////////////////////////////////////////////////////////////
//メイン
	////////////////////////////////////////////////////////////////////////////
	//タスクトレイ用ウィンドウ
	screen 1,300,200,2
	hwnd1=hwnd

	////////////////////////////////////////////////////////////////////////////
	//システムアイコンのハンドル取得
	iconindex=0
	hicon=ExtractIcon(hinstance,ICON_FILE,iconindex)

	////////////////////////////////////////////////////////////////////////////
	//ツールチップ用変数
	sdim tiptext,64

	////////////////////////////////////////////////////////////////////////////
	//NOTIFYICONDATA構造体(88バイト)
	dim icondata,22

	icondata(0)=88	//NOTIFYICONDATA構造体のサイズ
	icondata(1)=hwnd1	//親ウィンドウ
	icondata(2)=ID_TRAYICON	//アイコンの識別子
	icondata(3)=NIF_MESSAGE|NIF_ICON|NIF_TIP	//フラグ
	icondata(4)=NM_TRAYICON	//親ウィンドウに通知される値
	icondata(5)=hicon	//アイコンのハンドル
	dupptr tiptext,varptr(icondata)+24,64,2	//ツールチップに表示する文字
	tiptext="HSP タスクトレイサンプル\nアイコンインデックス:0"

	////////////////////////////////////////////////////////////////////////////
	//タスクトレイにアイコンを追加
	if Shell_NotifyIcon(NIM_ADD,icondata)==0:dialog "NIM_ADD error":end

	////////////////////////////////////////////////////////////////////////////
	//タスクトレイのアイコン変更タイマー
	SetTimer hwnd1,1234,3000,0

	////////////////////////////////////////////////////////////////////////////
	//メッセージ割り込み
	oncmd gosub *TRAYICON,NM_TRAYICON
	oncmd gosub *TIMER,WM_TIMER

	////////////////////////////////////////////////////////////////////////////
	//メインウィンドウ
	screen 0,300,200
	title "タスクトレイサンプル"

	////////////////////////////////////////////////////////////////////////////
	//メッセージ割り込み
	oncmd gosub *COMMAND,WM_COMMAND
	oncmd gosub *RBUTTONDOWN,WM_RBUTTONDOWN
	oncmd gosub *CLOSE,WM_CLOSE
stop

////////////////////////////////////////////////////////////////////////////////////
//メニュー表示
*menu
		hPopupMenu=CreatePopupMenu()
		InsertMenu hPopupMenu,0,0x400,0,"赤(&R)"
		InsertMenu hPopupMenu,1,0x400,1,"緑(&G)"
		InsertMenu hPopupMenu,2,0x400,2,"青(&B)"
		InsertMenu hPopupMenu,3,0x400,3,"終了(&Q)"
		TrackPopupMenu hPopupMenu,0x20,ginfo(0),ginfo(1),0,hwnd,0
		DestroyMenu hPopupMenu
return

////////////////////////////////////////////////////////////////////////////////////
//トレイアイコンメッセージ
*TRAYICON
	////////////////////////////////////////////////////////////////////////////
	//右クリックされた時、ポップアップメニュー表示
	if lparam==WM_RBUTTONDOWN{
		SetForegroundWindow hwnd1
		gosub *menu
		PostMessage hwnd1,WM_NULL,0,0
	}
return

////////////////////////////////////////////////////////////////////////////////////
//クライアント上で右クリックした時
*RBUTTONDOWN
	gosub *menu
return

////////////////////////////////////////////////////////////////////////////////////
//メニュー処理
*COMMAND
	switch wparam & 0xffff
		case 0
			color 255,0,0:boxf
		swbreak

		case 1
			color 0,255,0:boxf
		swbreak

		case 2
			color 0,0,255:boxf
		swbreak

		case 3
			PostMessage hwnd,WM_CLOSE,0,0
		swbreak

		default
		swbreak
	swend
return

////////////////////////////////////////////////////////////////////////////////////
//タスクトレイのアイコン変更タイマー
*TIMER
	iconindex++
	hicon=ExtractIcon(hinstance,ICON_FILE,iconindex)
	if hicon==0:iconindex=0:return

	icondata(3)=NIF_ICON|NIF_TIP
	icondata(5)=hicon
	tiptext="HSP タスクトレイサンプル\nアイコンインデックス:"+iconindex
	title "HSP タスクトレイサンプル INDEX: "+iconindex
	ret=Shell_NotifyIcon(NIM_MODIFY,icondata)
	
return
////////////////////////////////////////////////////////////////////////////////////
//終了時にアイコンを削除
*CLOSE
	KillTimer hwnd1 , 1234
	if Shell_NotifyIcon(NIM_DELETE,icondata)==0:dialog "NIM_DELETE error"
return


コメント ( 0 ) | Trackback ( 0 )
« タイトルバー... NTPによる時刻... »
 
コメント
 
コメントはありません。
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。