#module "trayicon"
#define __TRAYICONSAMPLE__ ;// コメントを解除するとサンプルを実行できます
#define WM_TRAYEVENTSTART $900
#define MAXICONS 16 ;// ←アイコン最大数定義
#uselib "Kernel32.dll"
#func GetModuleFileName "GetModuleFileNameA" nullptr,prefstr,int ;// 自分自身の名前を得るAPI
#uselib "Shell32.dll"
#func ExtractIconEx "ExtractIconExA" sptr,int,nullptr,var,int ;// ファイルからアイコンを抽出する
#func Shell_NotifyIcon "Shell_NotifyIconA" int,var ;// タスクトレイアイコンを制御する
#uselib "user32.dll"
#func DestroyIcon "DestroyIcon" int
#deffunc DestroyTrayIcon int iconid
dim NOTIFYICONDATA,88/4 ;// NOTIFYICONDATA 構造体を作る。
NOTIFYICONDATA = 88, hWnd, iconid
Shell_NotifyIcon 2, NOTIFYICONDATA ;// アイコンを削除する。
if hIcon.iconid { DestroyIcon hIcon.iconid : hIcon.iconid = 0 } ;// アイコンハンドル破棄
return
#deffunc CreateTrayIcon str tooltip, int nIconIndex, int iconid
if hIcon.iconid { DestroyTrayIcon iconid }
ExtractIconEx icofile, nIconIndex, hIcon.iconid, 1
dim NOTIFYICONDATA,88/4
NOTIFYICONDATA = 88, hWnd_, iconid, 7, WM_TRAYEVENTSTART, hIcon.iconid
poke NOTIFYICONDATA, 4*6, tooltip
Shell_NotifyIcon 0, NOTIFYICONDATA
return
#deffunc PopupBalloonTip str balloonInfoTitle, str balloonInfo, int balloonIcon,int iconid
dim NOTIFYICONDATA,488/4
NOTIFYICONDATA = 488, hWnd_, iconid, $10
poke NOTIFYICONDATA, 4*40, balloonInfo
NOTIFYICONDATA.104 = 1000*20
poke NOTIFYICONDATA, 4*105, balloonInfoTitle
NOTIFYICONDATA.121 = balloonIcon
Shell_NotifyIcon 1, NOTIFYICONDATA
return
#deffunc SetTrayIconFile str filename
sdim icofile,1024
if filename = "" { GetModuleFileName 1024 : icofile = refstr }
else { icofile = filename }
return
#deffunc _init_trayicon_
mref bmscr,96: hWnd_ = bmscr.13
dim hIcon,MAXICONS : SetTrayIconFile "" : return
length
#deffunc _deinit_trayicon_ onexit
foreach hIcon : if hIcon.cnt { DestroyTrayIcon cnt } loop : return
#global
_init_trayicon_
#ifdef __TRAYICONSAMPLE__@trayicon
mci "sound SystemHand"
SetTrayIconFile "user32.dll"
CreateTrayIcon "アイコンにマウスを重ねたときのチップ",1,0
PopupBalloonTip "タイトルの部分","内容の部分",2,0
stop
///バルーンチップここまで
#module
;***** 必要となるAPIや定数の定義 *****
#uselib "kernel32.dll"
#func GetModuleFileName "GetModuleFileNameA" int,var,int
#uselib "shell32.DLL"
#func ExtractIconEx "ExtractIconExA" var,int,var,var,int
#func Shell_NotifyIcon "Shell_NotifyIcon" int,var
#define NIM_ADD $00000000
#define NIM_DELETE $00000002
#define NIM_MODIFY $00000001
#define NIF_ICON $00000002
#define NIF_MESSAGE $00000001
#define NIF_TIP $00000004
;***** タスクトレイにアイコン格納 *****
#defcfunc tasktray str prm1
; prm1 : tooltext (str) : 文字列 or 文字列型変数 (ツールチップ文字列)
tooltext = prm1 : if strlen(tooltext)==0 : tooltext=""
; 自分自身のファイル名を取得
sdim lpFileName,260
GetModuleFileName hModule,lpFileName,260
SelfName=lpFileName
icobig=0
ExtractIconEx SelfName,0,icobig,icosmall,1
hIcon=icosmall
; NOTIFYICONDATA 構造体
dim IcoData,22
IcoData(0) = 88
IcoData(1) = hwnd
IcoData(2) = 1
IcoData(3) = NIF_MESSAGE|NIF_ICON|NIF_TIP
IcoData(4) = $00001400 ;NOTIFY_TRAYICON
IcoData(5) = hIcon
poke IcoData, 24, tooltext
; タスクトレイにアイコンを追加
Shell_NotifyIcon NIM_ADD,IcoData
return hIcon
;***** タスクトレイアイコンを削除 *****
#deffunc taskicoclr
; NOTIFYICONDATA 構造体
dim IcoData,22
IcoData(0) = 88
IcoData(1) = hwnd
IcoData(2) = 1
IcoData(3) = NIF_ICON
Shell_NotifyIcon NIM_DELETE,IcoData
return 0
;***** タスクトレイアイコンの変更 *****
#deffunc taskchengeico int prm1
; prm1 : nhIcon (int) : 変更するスモールアイコンハンドル
nhIcon = prm1 : if nhIcon==0 : return -1
; NOTIFYICONDATA 構造体
dim IcoData,22
IcoData(0) = 88
IcoData(1) = hwnd
IcoData(2) = 1
IcoData(3) = NIF_ICON
IcoData(5) = nhIcon
; タスクトレイアイコンを変更
Shell_NotifyIcon NIM_MODIFY,IcoData
return 0
;***** タスクトレイのチップヘルプを変更 *****
#deffunc tasktooltip str prm1
; prm1 : tooltext (str) : 文字列 or 文字列型変数 (ツールチップ文字列)
tooltext = prm1 : if strlen(tooltext) ==0 : tooltext=""
; NOTIFYICONDATA 構造体
dim IcoData,22
IcoData(0) = 88
IcoData(1) = hwnd
IcoData(2) = 1
IcoData(3) = NIF_TIP
poke IcoData, 24, tooltext
; タスクトレイのチップヘルプを変更
Shell_NotifyIcon NIM_MODIFY,IcoData
return 0
#global
;***** sample *****
#define WM_LBUTTONDOWN $00000201
#define NOTIFY_TRAYICON $00001400
onexit *owari
;***** イベントハンドラ *****
oncmd gosub *OnMotificmd, NOTIFY_TRAYICON
objsize 200,26
button "タスクトレイに格納",*modecmd
stop
;***** タスクトレイに格納(左クリックで復帰)*****
*modecmd
gsel 0,-1
gosub *trayico
stop
;***** NOTIFY_TRAYICONを処理する *****
*OnMotificmd
itemID=lparam
switch itemID
case WM_LBUTTONDOWN
gsel 0,2
gosub *icondel
swbreak
swend
return
;***** タスクトレイに入れる *****
*trayico
tooltext = "HSP Script Control"
hIcon=tasktray(tooltext)
return
;***** タスクトレイのアイコン削除 *****
*icondel
taskicoclr
return
*owari
end
////タスクトレイ格納ここまで
#uselib "user32.dll"
#func DestroyIcon "DestroyIcon" int
#func AppendMenu "AppendMenuA" int, int, int, str
#func DestroyMenu "DestroyMenu" int
#cfunc CreatePopupMenu "CreatePopupMenu"
#func TrackPopupMenu "TrackPopupMenu" int, int, int, int, int, int
#define WM_RBUTTONDOWN $00000204
#define NOTIFY_TRAYICON $00001400
oncmd gosub *OnMotificmd, NOTIFY_TRAYICON
*OnMotificmd
itemID=lparam
switch itemID
case WM_RBUTTONDOWN
hMenu.1 = CreatePopupMenu ()
AppendMenu hMenu.1, , $1, "開く"
AppendMenu hMenu.1, $800, , ""
AppendMenu hMenu.1, , $2, "終了"
TrackPopupMenu hMenu.1, $100, ginfo (0), ginfo (1), , hwnd
if stat = 0 : return
gsel 0,2
if ( stat = $1 ) { gosub *trayico }
if ( stat = $2 ) { gsel 0,-1 : dialog "終了しますか?",2,"お知らせ" : if (stat=6){ end } : else{}
swbreak
swend
return
/////右クリックメニューここまで
これをすべて合わせてNO.61709に書いた通りのことを
したいのですが、うまくいきません。
タスクトレイに格納すると新しいアイコンが増えてしまいます
それを右クリックしても当然でてきませんw
アイコンを一つにし、右クリックメニューも可能にはできないでしょうか?