こんにちはVB超初心者のひろんたと申します。
API集重宝しています。
ところでタスクトレーにアイコンを表示するのはソース通り
動いたのですが点滅とか違うアイコンと交互の表示とか
してみたいのですがアドバイスお願いします。
ええと…。
APIを呼び出すところまでは同じ(いくつか省略可だった気もしますが、やめときましょう^^;)、
APIの呼び出しで、第一引数を、NIM_MODIFYに変えます。
さて、でも、これでアイコンを変えられるので、
大体は対応したことになりますけど、
このままでは、エクスプローラ強制終了時に、アイコンが消えてしまいます。
対処するにはRegisterWindowMessageAPIを使って、TaskbarCreatedという名前のメッセージの数値を得て、
そのメッセージがきたら、アイコンを再登録する必要があります。
早速の回答ありがとうございます。
NIM_MODIFYにしてその後どのほうなソースにすれば
いいのでしょうか?
超初心者のわたしには難しいです。
はじめてVBをさわって初めてプログラムを書いている状態なんで
>RegisterWindowMessageAPIを使って、TaskbarCreated
もわかりません
実はメールチェックソフトを作ろうと思い
タスクトレーにメールがきたら点滅させようと
していますがほかの部分は大体できたのですが
なかなか勉強不足で難しい状態です
色々HP回って勉強してみます。
ありがとうございました。
Public Const NIF_ICON = &H2を
&h0にしたらアイコン分確保されて非表示になりました
これをうまくつかえないでしょうか?
アイコンはちゃんと登録できたんですよね?
それと同じといったんです。
APIの呼び出しの第一引数が違うだけです。
アイコンとして指定したものに、変わります。
点滅の方法は、もうわかりますね?
> >RegisterWindowMessageAPIを使って、TaskbarCreated
> もわかりません
ええと、エクスプローラが強制終了すると、タスクトレイアイコンは消えてしまいます。
でも、そのときに、すべてのウィンドウに上のメッセージを送るのです。
いくつものウィンドウで共有するメッセージを使うときは、
RegisterWindowMessageというAPIを使って得る数値を使うということになっているため、
これを使います。
メッセージは、ウィンドウプロシージャに流れてくるので、それを拾えばいいんですけど、
VBではサブクラス化をしないと拾えません^^;
サブクラス化については、この掲示板でもたびたびでてるので、
掲示板を検索したりして調べてください。
ほかの開発言語なら、簡単に拾えるんですけど…。
ウィンドウメッセージについては、わたしのページの"旧学校"に書いてます。
http://TakamiChie.tripod.co.jp/
> &h0にしたらアイコン分確保されて非表示になりました
発想は悪くないと思いますけど…。
それらの定数はWindowsに予約されているので、変更はしないほうがいいです。
たかみちえさん毎回毎回ほんとうにありがとうございます。
>アイコンはちゃんと登録できたんですよね?
最初タスクトレーにでたアイコンはVB特有のアイコン
だったのでIconで違うファイルにして表示しています。
なので
>APIの呼び出しの第一引数が違うだけです。
> アイコンとして指定したものに、変わります。
でNIM_MODIFYにしましたが最初から設定してあるアイコンのままです。
点滅はRet = Shell_NotifyIcon(NIM_MODIFY, NID)
とRet = Shell_NotifyIcon(NIM_DELETE, NID)
をタイマーなどで繰り返し実行すればいいのでしょうか?
よろしくお願いします。
ありゃ?それでよかったと思いますけど…。間違ってたかな…。
まともにAPIを使ってアイコンを表示したの、一回しかないので…m(__)m
(Delphiでは、コンポーネントをおくだけで済みますし(^^ゞ)
Googleなどで"NIM_MODIFY"とか入れてみると、何か見つかると思いますけど。
> 点滅はRet?=?Shell_NotifyIcon(NIM_MODIFY,?NID)
> とRet?=?Shell_NotifyIcon(NIM_DELETE,?NID)
> をタイマーなどで繰り返し実行すればいいのでしょうか?
英語と同じです。"見えないアイコン"を表示させてください。
調べてきました。やっぱり"API呼び出しだけを変える"でいいようですね。
ただし、登録時に、uFlagsにNIF_ICONがないとだめかもしれません。
あとは、構造体のhIconに、(次に)表示したいアイコンを指定すればよかったはずです。
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<")
> アイコンのハンドルを理解してないので変えられません
> どうすればいいでしょうか?
追加するとき、hIconにnIconを代入していますよね?
それと同じように、別のアイコンのハンドルを指定してください。
それと、API以外の部分は全部同じでいいので、
上記二つの関数は、まとめられますね。(最後にどうするのかを、引数で指定しておけばいい)
こういうところでうまく工夫すると、コードの量はぐんと減らせますよ。
> でもなんで難しいんだろ<VB (>o<")
まあ、たしかに、ちょっと高度なことをやろうとすると、すぐ限界が来るので、そういう意味では、VBは難しいですね。
さらに、デバイスコンテキストハンドルとか、いろいろ、
APIと互換性のないものがやたらと多いし。
APIを使うこと自体、想定されていないんですね。
そういう意味では、Delphiのほうがとても簡単です。
APIを使おうと思ったらすぐ使える)し、ちょっとしたミスでも警告してくれるし。
なにより動作面でも安定してるはずです。(VBのようにランタイムに依存しないので)
開発環境があんまり安定してないのが難点ですが^^;
Borlandのサイト(http://www.borland.co.jp/)で、
今ならDelphi6Personalに限り(商用、業務用の利用はだめ、データベース系コンポーネントなし、でもそれ以外は普通に使えます)
無償配布されていますから、それを使うというのもありではないでしょうか?
(要使用者登録)
まあ、せっかく買ったのに、すぐDelphiに移行してしまうのはとてももったえないですけど…。
Delphiでプログラミングに慣れておけば、いざVBをもう一度やるとなっても、
基盤(Windows)が同じなので、ずいぶん楽なはずです。
ちなみにハンドルというものについても、
旧学校にて説明してあるので、今後のためにも読んでみてください。
そうそう、それから気がついたでしょうか?
>?Ret?=?Shell_NotifyIcon(NIM_MODIFY,?NID)
このコードでは、APIの戻り値を変数Retに代入しています。
が、この変数Retは、"一度も使われていません"。
APIの戻り値では、多くの場合APIのエラーコードなどを返すので、必要なものですけど、
この場合は一度も使わないので、そもそも代入しないという風にしても、
コード自体は成り立ちます。
(戻り値の代入先を指定しなかった場合、戻り値として返されたデータは、その場で破棄されます)
Delphiでは、こういう変数は、コンパイラに"不要なもの"とみなされ、
最適化時に削除されるようですが、
VBでは最適化はされなかったと思うので、4バイトの無駄になります。
(どっちにしても一瞬データがVBソフト側に返されるので、+-0かもしれませんけど)
でもVBでは、Dim Ret As Longの一行を書かなくてよくなりますね。
こういうところで考えて、工夫しながらコーディングすると、プログラミングも結構楽しくなりますよ。
modifyIconっての作ってそこで
違うイメージを出すことに成功しました。
もちろんピクチャーの指定をなしにすれば
アイコン領域があって表示もだれないのができました
これで点滅等がつくれそうです
ありがとうございした。
ところで旧学校に行ってみたのですが
┗(‾□‾||)┛お、おもい。。。っす
でもまたひとつ困ったことが起きたんですが
非表示の後タイマー等で 表示<−>非表示
で点滅させたいのですが
ADDIOCnを使うとまた違う領域にアイコンができます
同じ場所で点滅するためにはmodityIcon を交互に
使うと思うのですがうまくいきません(涙)
なんかいい方法ないでしょうか?
ちなみに.hIcon = Form1.ImgIcon1.Pictureで
フォーム1のピクチャー画面を出しています。
なんかわかってきました。
どうもNIM_MODIFYは一回は使えるけど2回目は
駄目みたいです。
点滅or画面交互を違う方法でできないか色々
調べてみます。
でも今日一日でアイコンが変更できたので
すっごい進歩です
早く自分が思うプログラムが作れるように
がんばってみます。
でも勉強嫌いなんだよね〜(笑)
うろ覚えですが、アイコンのハンドルをいじって点滅させた記憶があります。
構造体のhIconを0にしたり アイコンハンドルを入れたり、というのを交互に繰り返して…。
takkさん
わざわざありがとうございます。
hicon を0にして非表示になりましたよ(^^)
でもなぜか2回目の
Shell_NotifyIcon(NIM_MODIFY, NID)がききません
トレースしてみたのですが成功値が帰ってきてるのに
アイコンがかわりません
なんででしょう?
ご指導よろしくお願いします。
一応僕がやってるプログラムを見直してみたところ
hIconを変更して、すぐにShell_NotifyIconを呼んでます。
'アイコンを変更
NID.hIcon = nIcon
Call Shell_NotifyIcon(NIM_MODIFY, NID)
設定しなおしているのはhIconだけですね。
他でもツールチップを変える時もszTipだけ変更してShell_NotifyIconを呼んでます。
僕のところではこれだけで普通に動いてるんですが…。
できました〜〜ヽ(゜▽゜*)乂(*゜▽゜)ノ バンザーイ♪
takkさん、たかみちえさん
本当に御指導ありがとうございました。
もう感激です。
これからも色々と勉強してたくさんソフト作ってみたいです。
今回はいい勉強になりました。
ツイート | ![]() |