Shell_NotifyIconで使用するNOTIFYICONDATA構造体は、
ANSI版とUTF-16版では違いがあります。
http://chokuto.ifdef.jp/urawaza/struct/NOTIFYICONDATA.html
こちらのサイトで紹介されている配列マップはANSI版ですが、
TIPS文を記述する部分(szTip)、バルーン本文を記述する部分(szInfo)、
バルーンタイトルを記述する部分(szInfoTitle)の大きさは、
ANSI版ではそれぞれ128バイト、256バイト、64バイトですが、
UTF-16版だとこれらは128文字文、256文字分、64文字分となり、
UTF-16での1文字は2バイトですから、これらのサイズは2倍になります。
その結果、配列マップの配列番号やオフセットもズレることになるので、
そこを考慮する必要が出てきます。
#include "hsp3utf.as"
#include "kernel32.as"
#include "shell32.as"
#include "user32.as"
#const NIF_MESSAGE 0x1
#const NIF_ICON 0x2
#const NIF_TIP 0x4
#const NIF_INFO 0x10
//トレイアイコン用のアイコンID
#const ID_TRAYICON 1
//トレイアイコン用のメッセージコード
#const MYWM_TRAYICON 0x1000
//アイコンを取得
sdim fname64,520
GetModuleFileNameW 0,varptr(fname64),260
hIcon=0 : ExtractIconExW varptr(fname64),0,0,varptr(hIcon),1
dim nid,238 //NOTIFYICONDATA構造体
//UTF-16版はANSI版に比べて448バイト(=整数配列112個分に相当)増える
nid=952,hwnd,ID_TRAYICON,NIF_MESSAGE|NIF_ICON|NIF_TIP|NIF_INFO,MYWM_TRAYICON,hIcon
//TIPS文
buf="TIPS文"
sdim buf64,strlen(buf)*2+2 : cnvstow buf64,buf //UTF-16に変換
lstrlenW varptr(buf64) //文字数を取得
memcpy nid,buf64,limit(stat,0,127)*2,24,0 //UTF-16文字列をコピー(終端ヌルを含めないと最大127文字)
//http://chokuto.ifdef.jp/urawaza/struct/NOTIFYICONDATA.html
//このサイト↑で紹介されている配列マップは、UTF-16版の場合だと、
//・dwState〜szInfoは128バイト、整数配列32個分ズレる
//・uTimeout〜szInfoTitleは384バイト、整数配列96個分ズレる
//・dInfoFlags以降は448バイト、整数配列112個分ズレる
//バルーン本文
buf="バルーン本文"
sdim buf64,strlen(buf)*2+2 : cnvstow buf64,buf
lstrlenW varptr(buf64) : memcpy nid,buf64,limit(stat,0,255)*2,288,0 //最大255文字
//バルーンタイトル
buf="バルーンタイトル"
sdim buf64,strlen(buf)*2+2 : cnvstow buf64,buf
lstrlenW varptr(buf64) : memcpy nid,buf64,limit(stat,0,63)*2,804,0 //最大63文字
nid(233)=2 //dwInfoFlags。アイコンを「警告」にしてみる。(不要なら削除してください)
Shell_NotifyIconW 0,varptr(nid)
onexit *exit
stop
*exit
//トレイアイコンの削除
dim nid,238
nid=952,hwnd,ID_TRAYICON
Shell_NotifyIconW 2,varptr(nid)
//アイコンの破棄
DestroyIcon hIcon
end
参考:
http://chokuto.ifdef.jp/urawaza/trayicon.html
http://chokuto.ifdef.jp/urawaza/api/Shell_NotifyIcon.html
http://chokuto.ifdef.jp/urawaza/struct/NOTIFYICONDATA.html