全然更新しないブログ
HSPメモ帳
タスクトレイアイコンの作成
「タスクトレイアイコンの作成」
タスクトレイアイコンの作成
SHELL32.DLLの「Shell_NotifyIcon」関数を使用する事で、
タスクトレイに追加、変更、削除が可能となります。
Shell_NotifyIcon dwMessage , lpdata 動作環境 shell32.dll version 4.0以上 Windows NT 4.0, Windows 95以上 |
第一引数 dwMessage: 以下数値のどれか
|
第二引数 NOTIFYICONDATA 構造体のポインタ
Ver 4はここまで Ver 5はここまで Ver 6はここまで |
タスクトレイアイコンからメニューの表示
タスクトレイからのメニュー表示で、
気をつけないといけない点がいくつかあります。
- メニューを表示する前に
「SetForegroundWindow」で親ウィンドウをアクティブにすること
しない場合、親ウィンドウ、メニューを選択するまでメニューが消えません。
以下サンプルでは、タスクトレイ用の非表示ウィンドウを親ウィンドウとしています。 - メニューの表示終了後、「WM_NULL」をポストすること
しない場合、メニューが表示されないことがあります。
- 【参考リンク】
- MSサポート技術情報 文書番号 : 135788
- メニュー表示について
※日本語での説明ですが、翻訳がおかしい部分があるので
英語版のほうを参照したほうがいいかもしれません。 - MSサポート技術情報 文書番号 : 418138
- タスクトレイにアイコンが表示されない時
- WM_TIMERを使用して、3秒毎にshell32.dll内のアイコンを順番に表示しています。
システムアイコンを利用しているので、メモリ解放はしていません。
※通常アイコンを使用する場合解放を忘れるとメモリリークの原因になりますが、
システムで使用しているものを解放するとシステムが不安定になる事があるからです。
- クライアントエリアまたはタスクトレイアイコンを右クリックすることでメニューを表示します。
クライアントエリアの色変更と終了が可能です。
サンプル |
//////////////////////////////////////////////////////////////////////////////////// //関数登録 #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による時刻... » |
コメント |
コメントはありません。 |
![]() |
コメントを投稿する |