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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0409
窓口Shell_NotifyIcon関数について3解決


窓口

リンク

2009/4/9(Thu) 22:06:02|NO.24531

先ほどはすみませんでした。
気を取り直して投稿し直します。

タスクバーにアイコンを登録するプログラムを作ったのですが。どうもうまくいきません。
どこか悪いところが有ればお願いします。


#include "shell32.as" #include "user32.as" ;nid.0 cbSize ( = 504 ) 0 4 ;nid.1 hWnd 4 4 ;nid.2 uID 8 4 ;nid.3 uFlags 12 4 ;nid.4 uCallbackMessage 16 4 ;nid.5 hIcon 20 4 ;nid.6 szTip 24 128 ;… ;nid.37 ;nid.38 dwState 152 4 ;nid.39 dwStateMask 156 4 ;nid.40 szInfo 160 256 ;… ;nid.103 ;nid.104 uTimeout / uVersion 416 4 ;nid.105 szInfoTitle 420 64 ;… ;nid.120 ;nid.121 dwInfoFlags 484 4 ;nid.122 guidItem 488 16 ;… ;nid.125 ;構造体に登録 ;######################################### #module ss_data ;######################################### ;変数タイプの登録 #define _char 1 #const _signed_char 1 #const _short_int 2 #const _unsigned_short_int 2 #const _int 4 #const _unsigned_int 4 #const _long_int 4 #const _unsigned_long_int 4 #const _float 4 #const _double 8 #const _long_double 10 #define char_ "char" #define signed_char_ "signed char" #define short_int_ "short int" #define unsigned_short_int_ "unsigned short int" #define int_ "int" #define unsigned_int_ "unsigned int" #define long_int_ "long int" #define unsigned_long_int_ "unsigned long int" #define float_ "float" #define double_ "double" #define long_double_ "long double" #define str_ "str" ;ステータス名の登録 #define _cbSize "cbSize" #define _hWnd "hWnd" #define _uID "uID" #define _uFlags "uFlags" #define _uCallbackMessage "uCallbackMessage " #define _hIcon "hIcon" #define _szTip "szTip" #define _dwState "dwState" #define _dwStateMask "dwStateMask " #define _szInfo "szInfo" #define _uTimeout_uVersion "uTimeout / uVersion" #define _szInfoTitle "szInfoTitle" #define _dwInfoFlags "dwInfoFlags" #define _guidItem "guidItem" ;作業用配列変数の定義 #define global dim_stat(%1,%2) sdim kouzoutai,%1 : dim ofset,2,%2 : sdim h_type,100,2,%2 #define dim_print(%1) mes str(ofset(0,%1))+" : "+str(ofset(1,%1))+" : "+h_type(0,%1)+" : "+h_type(1,%1) #define dim_print_all(%1) repeat %1 : dim_print cnt : loop ;typeを書き込むための命令 #deffunc add_type int add_tp_index , int add_tp_s1 , int add_tp_s2 , str add_tp_s3 , str add_tp_s4 st1 = add_tp_index st2 = add_tp_s1 st3 = add_tp_s2 st4 = add_tp_s3 st5 = add_tp_s4 ofset(0,add_tp_index) = st2 ofset(1,add_tp_index) = st3 h_type(0,add_tp_index) = st4 h_type(1,add_tp_index) = st5 return ;NOTIFYICONDATA構造体の定義の為の準備 #deffunc NOTIFYICONDATA_on dim_stat 488+16,14 add_type 0 ,0 , _int ,_cbSize ,int_ add_type 1 ,4 , _int ,_hWnd ,int_ add_type 2 ,8 , _int ,_uID ,int_ add_type 3 ,12 , _int ,_uFlags ,int_ add_type 4 ,16 , _int ,_uCallbackMessage ,int_ add_type 5 ,20 , _int ,_hIcon ,int_ add_type 6 ,24 , 128 ,_szTip ,str_ add_type 7 ,152 , _int ,_dwState ,int_ add_type 8 ,156 , _int ,_dwStateMask ,int_ add_type 9 ,160 , 256 ,_szInfo ,str_ add_type 10 ,416 , _int ,_uTimeout_uVersion ,int_ add_type 11 ,420 , 64 ,_szInfoTitle ,str_ add_type 12 ,484 , _int ,_dwInfoFlags ,int_ add_type 13 ,488 , 16 ,_guidItem ,str_ ; dim_print_all 14 return #define int_st2 : st2=int(st2) ;構造体への書き込み #deffunc struct_a_d_d int struct_a_d_d_s1 , str struct_a_d_d_s2 st1 = struct_a_d_d_s1 : st2 = struct_a_d_d_s2 switch h_type(1,st1) case signed_char_ int_st2 : poke kouzoutai, ofset(0,st1), st2 swbreak case short_int_ : case unsigned_short_int_ int_st2 : wpoke kouzoutai, ofset(0,st1), st2 swbreak case int_ : case unsigned_int_ : case unsigned_int_ case long_int_ : case unsigned_long_int_ int_st2 : lpoke kouzoutai, ofset(0,st1), st2 swbreak case float_ st2 = double(st2) : lpoke kouzoutai, ofset(0,st1), st2 case double_ case long_double_ swbreak default repeat strlen(st2) poke kouzoutai , ofset(0,st1)+cnt, peek(st2,cnt) loop swend return #define global struct_add(%1,%2) : struct_a_d_d %1,str(%2) ;構造体をプリント #deffunc struct_print int struct_print_s1 repeatr = struct_print_s1 repeat repeatr switch h_type(1,cnt) case signed_char_ mes h_type(0,cnt)+" : "+str(peek(kouzoutai,ofset(0,cnt))) swbreak case short_int_ : case unsigned_short_int_ mes h_type(0,cnt) +" : "+str(wpeek(kouzoutai,ofset(0,cnt))) swbreak case int_ : case unsigned_int_ : case unsigned_int_ case long_int_ : case unsigned_long_int_ mes h_type(0,cnt) +" : "+str(lpeek(kouzoutai,ofset(0,cnt))) swbreak case float_ mes h_type(0,cnt) +" : "+str(lpeek(kouzoutai,ofset(0,cnt))) swbreak case double_ swbreak case long_double_ swbreak default cunt=cnt sdim prit_ , ofset(1,cnt) repeat ofset(1,cnt) poke prit_,cnt,peek(kouzoutai,ofset(0,cunt)+cnt) if stat=7: end loop mes h_type(0,cnt) +" : "+prit_ swend loop return ;構造体が割り当てられているバッファを返す #defcfunc struct_load return kouzoutai ;比較 #deffunc struct_if str if_asss1 a=if_asss1 if a ! kouzoutai { dialog "違います" }else{ dialog "同じです" } return ;######################################### #global ;######################################### #define p(%1) dialog %1,2 : if stat=7 : end #define NIM_ADD $00000000 ; アイコンを追加 #define NIM_DELETE $00000002 ; 削除 #define NIM_MODIFY $00000001 ; 変更 #define NIM_mess $00001111 ; メッセージ #define US_cmd 0x1010 #define NIF_INFO 0x00000010 #define NIF_ICON $00000002 ; hIconが有効 #define NIF_MESSAGE $00000001 ; uCallbackMessageが有効 #define NIF_TIP $00000004 ; szTipが有効 NOTIFYICONDATA_on struct_add 0,502 struct_add 1,hwnd struct_add 2,0x00000010 struct_add 3,12 struct_add 4,US_cmd struct_add 5,12 struct_add 6,"noiztimer ver2.0" struct_add 7,0 struct_add 8,0 struct_add 9,"こんにちは" struct_add 10,999 struct_add 11,3 struct_add 12,0x00000003 struct_print 14 note_ify = struct_load() struct_if note_ify Shell_NotifyIcon NIM_ADD,varptr(note_ify) if stat = 0 : dialog "失敗しました" : end dialog "アイコンが追加されました" Shell_NotifyIcon NIM_DELETE,varptr(note_ify) end



この記事に返信する


KA

リンク

2009/4/10(Fri) 21:01:36|NO.24541

取りあえず
 1:何がどういう風にうまくいかないのかわからない。
 2:長ったらしくて見る気がしない。

いつも書かれていることですが
 1:問題が再現できる最小限のスクリプトにする。
 2:具体的に書く。

他の人も同じ様に感じているはずです。



レノス

リンク

2009/4/10(Fri) 21:48:04|NO.24543

> どうもうまくいきません
これでは何のことだかさっぱりです。
「エラー(番号)が出て実行できません。」
「実行するとアイコンが追加されますが、アイコンが表示されません。」
「実行してもすぐに強制終了します。」
こんな感じに、症状を具体的に記してください。( 今回は2番目。)

まず、「同じです」の時に、デバッグウィンドウで変数 note_ify の内容を
メモリダンプしてみてください。ほとんど 0 で、データがありません。
理由は、HSPのマニュアルから「hsp3文字列のひみつ」を熟読すればわかります。

つまり、原因は、struct_add で設定したデータを、struct_load() では一部しか取得できていないことです。

ヒント1:struct_load を命令にして、変数を受け取るようにしましょう。
ヒント2:memcpy 命令
素朴な愚問:窓口さんはC出身?



窓口

リンク

2009/4/10(Fri) 22:57:52|NO.24552

説明不足でごめんなさい。以後気をつけます。

ありがとうございます解決しました。
struct_loadを以下に変えたら、動くようになりました。


#deffunc struct_load var struct_load_s1 memcpy struct_load_s1 , kouzoutai , dim_size , 0 , 0 return

まだ足りないところが多いですが、これからいろいろ修正します。

自分の出身はHSPです。Cはまだまだ勉強中です。



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