タスクトレーアイコンについて

解決


ひろ  2003-02-24 03:55:34  No: 106104

こんにちはVB超初心者のひろんたと申します。
API集重宝しています。
ところでタスクトレーにアイコンを表示するのはソース通り
動いたのですが点滅とか違うアイコンと交互の表示とか
してみたいのですがアドバイスお願いします。


たかみちえ  URL  2003-02-24 04:07:17  No: 106105

ええと…。
APIを呼び出すところまでは同じ(いくつか省略可だった気もしますが、やめときましょう^^;)、
APIの呼び出しで、第一引数を、NIM_MODIFYに変えます。

  さて、でも、これでアイコンを変えられるので、
大体は対応したことになりますけど、
このままでは、エクスプローラ強制終了時に、アイコンが消えてしまいます。
  対処するにはRegisterWindowMessageAPIを使って、TaskbarCreatedという名前のメッセージの数値を得て、
そのメッセージがきたら、アイコンを再登録する必要があります。


ひろんた  2003-02-24 04:27:46  No: 106106

早速の回答ありがとうございます。
NIM_MODIFYにしてその後どのほうなソースにすれば
いいのでしょうか?
超初心者のわたしには難しいです。
はじめてVBをさわって初めてプログラムを書いている状態なんで

>RegisterWindowMessageAPIを使って、TaskbarCreated

もわかりません
実はメールチェックソフトを作ろうと思い
タスクトレーにメールがきたら点滅させようと
していますがほかの部分は大体できたのですが
なかなか勉強不足で難しい状態です
色々HP回って勉強してみます。
ありがとうございました。


ひろんた  2003-02-24 04:37:56  No: 106107

Public Const NIF_ICON = &H2を
&h0にしたらアイコン分確保されて非表示になりました
これをうまくつかえないでしょうか?


たかみちえ  URL  2003-02-24 05:12:53  No: 106108

アイコンはちゃんと登録できたんですよね?
それと同じといったんです。
APIの呼び出しの第一引数が違うだけです。
  アイコンとして指定したものに、変わります。
点滅の方法は、もうわかりますね?

> >RegisterWindowMessageAPIを使って、TaskbarCreated
> もわかりません
  ええと、エクスプローラが強制終了すると、タスクトレイアイコンは消えてしまいます。
  でも、そのときに、すべてのウィンドウに上のメッセージを送るのです。
  いくつものウィンドウで共有するメッセージを使うときは、
RegisterWindowMessageというAPIを使って得る数値を使うということになっているため、
これを使います。

  メッセージは、ウィンドウプロシージャに流れてくるので、それを拾えばいいんですけど、
VBではサブクラス化をしないと拾えません^^;
  サブクラス化については、この掲示板でもたびたびでてるので、
掲示板を検索したりして調べてください。

  ほかの開発言語なら、簡単に拾えるんですけど…。

  ウィンドウメッセージについては、わたしのページの"旧学校"に書いてます。
http://TakamiChie.tripod.co.jp/

> &h0にしたらアイコン分確保されて非表示になりました
  発想は悪くないと思いますけど…。
それらの定数はWindowsに予約されているので、変更はしないほうがいいです。


ひろんた  2003-02-24 05:53:34  No: 106109

たかみちえさん毎回毎回ほんとうにありがとうございます。
>アイコンはちゃんと登録できたんですよね?
最初タスクトレーにでたアイコンはVB特有のアイコン
だったのでIconで違うファイルにして表示しています。
なので
>APIの呼び出しの第一引数が違うだけです。
>  アイコンとして指定したものに、変わります。
でNIM_MODIFYにしましたが最初から設定してあるアイコンのままです。
点滅はRet = Shell_NotifyIcon(NIM_MODIFY, NID)
とRet = Shell_NotifyIcon(NIM_DELETE, NID)
をタイマーなどで繰り返し実行すればいいのでしょうか?

よろしくお願いします。


たかみちえ  URL  2003-02-24 07:37:57  No: 106110

ありゃ?それでよかったと思いますけど…。間違ってたかな…。
  まともにAPIを使ってアイコンを表示したの、一回しかないので…m(__)m
(Delphiでは、コンポーネントをおくだけで済みますし(^^ゞ)
  Googleなどで"NIM_MODIFY"とか入れてみると、何か見つかると思いますけど。

> 点滅はRet?=?Shell_NotifyIcon(NIM_MODIFY,?NID)
> とRet?=?Shell_NotifyIcon(NIM_DELETE,?NID)
> をタイマーなどで繰り返し実行すればいいのでしょうか?
  英語と同じです。"見えないアイコン"を表示させてください。


たかみちえ  URL  2003-02-24 08:14:43  No: 106111

調べてきました。やっぱり"API呼び出しだけを変える"でいいようですね。
ただし、登録時に、uFlagsにNIF_ICONがないとだめかもしれません。
あとは、構造体のhIconに、(次に)表示したいアイコンを指定すればよかったはずです。


ひろんた  2003-02-24 19:53:56  No: 106112

Public Function AddIcon(nHwnd As Long, nIcon As Long, nString As String)
 
Dim Ret As Long
    
nString = nString & Chr(0)
    
With NID
   .cbSize = Len(NID)                 '構造体のサイズを設定
   .hIcon = nIcon                  'アイコンの設定
   .hWnd = nHwnd                      'ウインドウの設定
   .szTip = nString & Chr(0)          'ツールチップの設定
   .uCallbackMessage = WM_MOUSEMOVE   'メッセージの設定
   .uFlags = NIF_ICON Or _
             NIF_TIP Or _
             NIF_MESSAGE              'フラグの設定
   .uID = 1                           'ユーザーIDの設定
    End With

  'タスクトレイにアイコンを追加
   Ret = Shell_NotifyIcon(NIM_ADD, NID)
  'Ret = Shell_NotifyIcon(NIM_MODIFY, NID)
End Function
でアイコンが追加されますよね
次に
Public Function MODIFYIcon(nHwnd As Long, nIcon As Long, nString As String)
 
Dim Ret As Long
    
  nString = nString & Chr(0)
    
  With NID
   .cbSize = Len(NID)                 '構造体のサイズを設定
   .hIcon = nIcon                  'アイコンの設定

>>ここを変える事ですよね?
アイコンのハンドルを理解してないので変えられません
どうすればいいでしょうか?

  .hWnd = nHwnd                      'ウインドウの設定
   .szTip = nString & Chr(0)          'ツールチップの設定
   .uCallbackMessage = WM_MOUSEMOVE   'メッセージの設定
   .uFlags = NIF_ICON Or _
             NIF_TIP Or _
             NIF_MESSAGE              'フラグの設定
   .uID = 1                           'ユーザーIDの設定
  End With

  'タスクトレイにアイコンを追加
   Ret = Shell_NotifyIcon(NIM_MODIFY, NID)
End Function

ハンドルについて勉強してみます。
でもなんで難しいんだろ<VB  (>o<")


たかみちえ  URL  2003-02-24 21:04:06  No: 106113

> アイコンのハンドルを理解してないので変えられません
> どうすればいいでしょうか?
  追加するとき、hIconにnIconを代入していますよね?
それと同じように、別のアイコンのハンドルを指定してください。

  それと、API以外の部分は全部同じでいいので、
上記二つの関数は、まとめられますね。(最後にどうするのかを、引数で指定しておけばいい)
  こういうところでうまく工夫すると、コードの量はぐんと減らせますよ。

> でもなんで難しいんだろ<VB (>o<")
  まあ、たしかに、ちょっと高度なことをやろうとすると、すぐ限界が来るので、そういう意味では、VBは難しいですね。
  さらに、デバイスコンテキストハンドルとか、いろいろ、
APIと互換性のないものがやたらと多いし。
  APIを使うこと自体、想定されていないんですね。

  そういう意味では、Delphiのほうがとても簡単です。
APIを使おうと思ったらすぐ使える)し、ちょっとしたミスでも警告してくれるし。
  なにより動作面でも安定してるはずです。(VBのようにランタイムに依存しないので)
開発環境があんまり安定してないのが難点ですが^^;

  Borlandのサイト(http://www.borland.co.jp/)で
今ならDelphi6Personalに限り(商用、業務用の利用はだめ、データベース系コンポーネントなし、でもそれ以外は普通に使えます)
無償配布されていますから、それを使うというのもありではないでしょうか?
(要使用者登録)
  まあ、せっかく買ったのに、すぐDelphiに移行してしまうのはとてももったえないですけど…。
  Delphiでプログラミングに慣れておけば、いざVBをもう一度やるとなっても、
基盤(Windows)が同じなので、ずいぶん楽なはずです。

  ちなみにハンドルというものについても、
旧学校にて説明してあるので、今後のためにも読んでみてください。


たかみちえ  URL  2003-02-24 21:17:16  No: 106114

そうそう、それから気がついたでしょうか?
>?Ret?=?Shell_NotifyIcon(NIM_MODIFY,?NID)
  このコードでは、APIの戻り値を変数Retに代入しています。
が、この変数Retは、"一度も使われていません"。
  APIの戻り値では、多くの場合APIのエラーコードなどを返すので、必要なものですけど、
この場合は一度も使わないので、そもそも代入しないという風にしても、
コード自体は成り立ちます。
(戻り値の代入先を指定しなかった場合、戻り値として返されたデータは、その場で破棄されます)
  Delphiでは、こういう変数は、コンパイラに"不要なもの"とみなされ、
最適化時に削除されるようですが、
VBでは最適化はされなかったと思うので、4バイトの無駄になります。
(どっちにしても一瞬データがVBソフト側に返されるので、+-0かもしれませんけど)
  でもVBでは、Dim Ret As Longの一行を書かなくてよくなりますね。

  こういうところで考えて、工夫しながらコーディングすると、プログラミングも結構楽しくなりますよ。


ひろんた  2003-02-25 01:08:13  No: 106115

modifyIconっての作ってそこで
違うイメージを出すことに成功しました。
もちろんピクチャーの指定をなしにすれば
アイコン領域があって表示もだれないのができました
これで点滅等がつくれそうです
ありがとうございした。
ところで旧学校に行ってみたのですが
┗(‾□‾||)┛お、おもい。。。っす

でもまたひとつ困ったことが起きたんですが
非表示の後タイマー等で  表示<−>非表示
で点滅させたいのですが
ADDIOCnを使うとまた違う領域にアイコンができます

同じ場所で点滅するためにはmodityIcon を交互に
使うと思うのですがうまくいきません(涙)

なんかいい方法ないでしょうか?
ちなみに.hIcon = Form1.ImgIcon1.Pictureで
フォーム1のピクチャー画面を出しています。


ひろんた  2003-02-25 01:55:49  No: 106116

なんかわかってきました。
どうもNIM_MODIFYは一回は使えるけど2回目は
駄目みたいです。
点滅or画面交互を違う方法でできないか色々
調べてみます。

でも今日一日でアイコンが変更できたので
すっごい進歩です
早く自分が思うプログラムが作れるように
がんばってみます。

でも勉強嫌いなんだよね〜(笑)


takk  2003-02-25 03:13:26  No: 106117

うろ覚えですが、アイコンのハンドルをいじって点滅させた記憶があります。
構造体のhIconを0にしたり アイコンハンドルを入れたり、というのを交互に繰り返して…。


ひろんた  2003-02-25 04:36:57  No: 106118

takkさん
わざわざありがとうございます。

hicon を0にして非表示になりましたよ(^^)

でもなぜか2回目の
Shell_NotifyIcon(NIM_MODIFY, NID)がききません
トレースしてみたのですが成功値が帰ってきてるのに
アイコンがかわりません
なんででしょう?

ご指導よろしくお願いします。


takk  2003-02-25 19:09:38  No: 106119

一応僕がやってるプログラムを見直してみたところ
hIconを変更して、すぐにShell_NotifyIconを呼んでます。

    'アイコンを変更
    NID.hIcon = nIcon
    Call Shell_NotifyIcon(NIM_MODIFY, NID)

設定しなおしているのはhIconだけですね。
他でもツールチップを変える時もszTipだけ変更してShell_NotifyIconを呼んでます。
僕のところではこれだけで普通に動いてるんですが…。


ひろんた  2003-02-25 19:18:31  No: 106120

できました〜〜ヽ(゜▽゜*)乂(*゜▽゜)ノ バンザーイ♪

takkさん、たかみちえさん
本当に御指導ありがとうございました。
もう感激です。

これからも色々と勉強してたくさんソフト作ってみたいです。
今回はいい勉強になりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加