HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0722
UT-Xタスクトレイアイコンとバルーンの表示(Unicode使用)2解決


UT-X

リンク

2021/7/22(Thu) 22:14:43|NO.93275

開発中のソフトでタスクトレイにアイコンを表示してバルーンを表示したいのですが、
HSPを用いて解説されていたものはすべてANSI/Shift_JIS用のものしかありませんでした。
開発中のソフトはUTF-8を使っているので、解説にあるものを使用すると文字化けしてしまいます。
UNICODEを用いてタスクトレイにアイコンを表示してバルーンを表示する場合は、どうすればよいのでしょうか。
(文字列のUTF-16への変換が必要でも構いません)



この記事に返信する


沢渡

リンク

2021/7/23(Fri) 12:07:56|NO.93286

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



UT-X

リンク

2021/7/23(Fri) 12:41:08|NO.93288

回答ありがとうございます。
お教えいただいた通り調整したところ、正常に表示できることを確認しました。
あとで参照できるようにNOTIFYICONDATAW構造体の配列番号をメモしておきます。
0 cbsize
1 hwnd
2 ui
3 uflags
4 ucallbackmessage
5 hicon
6-69 sztip(127文字+null)
70 dwstate
71 dwstatemask
72-199 szinfo(255文字+null)
200 utimeout/uversion
201-232 szinfotitle(63文字+null)
233 dwInfoFlags



ONION software Copyright 1997-2023(c) All rights reserved.