こんにちは。
ふと気になりました。
タスクトレイにアイコンがたくさん並んでいるときに、
それぞれのアイコンを非表示にすることは
アプリ側で制御するやりかたはどういうものでしょうか?
WinXPですと
OSの設定で一部を非表示にできたり
そういうソフトがあるということはしっていますが
それを使いたいということではなく
それを開発したいということです。
環境はWinXPやVista、2000などで
動作するやり方を知りたいです。
よろしくお願いします。
TrayExpand - タスクバー拡張ツール
ttp://qwerty.s2.xrea.com/TrayExpand.xhtml
Cですが、ソースつきです。
タスクトレイをフックして動かしているようです。
・・・的外れかな?
…厄介ですね…詳細までは読めないですし、
フックだと難しいっすな。
誰かコード書いてないかな。
教えてくださり、ありがとうございます。
まだ解決にせずに
もうちょっと実際のDelphiコードを待ってみます。
タスクトレイアイコンを自作アプリ側で表示非表示を制御したいってこと?
それとも「使用していない物を隠す」に含めたいってこと?
コード書いてくださいなんて、虫が良すぎだろ
> それとも「使用していない物を隠す」に含めたいってこと?
XPのこの機能は、レジストリに書き込まれていて、解析すれば書き換えできるけど、
現在の状態を変更できない。
某ソフトで、これを削除したり、状態を変更するものがあるけど、
変更後は、強制的にExplorerを落として、再起動させている模様。
レジストリ書き換えて、タスクマネージャで強制終了&再起動という、
手作業でやったことあるけど、反映されなかったことから、ほかに何か
必要なのかもしれない。
> コード書いてくださいなんて、虫が良すぎだろ
誰か Delphiで書いたコード持っている人(公開している人)いないかな?
という意味ではないのか?
まぁ、個人的には書いてみたいが、ちょっとじっくり調べる時間ない。
情報ありがとうございます。
> 変更後は、強制的にExplorerを落として、再起動させている模様。
なかなか厳しい動作ですね。簡単には難しそうです。
> コード書いてくださいなんて、虫が良すぎだろ
難しすぎるコードですかね。
どなたかその部分のソース公開してくれたりしているといいんですが。
知っていたら教えてください。ということ程度でよろしくです。
> どなたかその部分のソース公開してくれたりしているといいんですが。
公開されているものなら探せば見つかるでしょう。
どうも「探す」という行為自体人任せにしているように聞こえて、引っ掛かりを感じるのですが……
> 知っていたら教えてください。ということ程度でよろしくです。
知っていることを教えてもらった結果が
> まだ解決にせずに
> もうちょっと実際のDelphiコードを待ってみます。
ですから、結局誰かがコードを探してくるか書いてあげるまで解決にならないってことですよね。
そもそも「はて?」さんの出した質問(実際にやりたいことは何なのか)にまだ答えてもらっていないようですが。
トレイのアイコンを実際に非表示にする(=削除する)のか、それとも隠す(=トレイを開けば見える)ようにしたいのか、
削除したら消えっぱなしでいいのか、それとも復活できる必要があるのか、それによって実現方法もまったく違ってきます。
トレイアイコンを登録するプログラムを書いたことがあれば知っていると思いますが、
アイコンを非表示(削除)にするには登録時に使用したウィンドウハンドルとIDを指定します。
それを知りうるのは登録した当のプログラムと、登録を受け付けたシェルだけです。
つまり原理的には自分が登録したアイコンしか非表示にできません。
第三者がトレイアイコンを操作したければ、何らかの方法でそれを横取りする必要があります。
後者の「隠す」操作にしても、XP以降はそのようなユーザの好みで設定する箇所を
プログラムが勝手にいじれないよう「あえて」インタフェースを用意しない方針になってきています。ですから、いずれにしても
> 難しすぎるコードですかね。
頼まれたからといって簡単にできるものではないと思いますよ。
こんにちは。
> タスクトレイアイコンを自作アプリ側で表示非表示を制御したいってこと?
> それとも「使用していない物を隠す」に含めたいってこと?
前者になります。隠すものに含ませるのではなく
自分のアプリで他アプリのタスクトレイアイコン
制御したいと思いますが。
タスクバーフックコードが必要になるのですね。
> 頼まれたからといって簡単にできるものではないと思いますよ。
わかりました。
ありがとうございます。解決としておきます。
かなり難しいということがわかったことでも助かります。
> どうも「探す」という行為自体人任せにしているように聞こえて、引っ掛かりを感じるのですが……
最近は海外の掲示板でソースが載っていたりする
ところもあるので、そういうところまでは
探しきれなかったりするので、知っておられる方いましたら
教えてください。という意味でいいましたよ。
不愉快に思われたら、失礼しました。
ノータスクトレイアイコン2
http://www.asahi-net.or.jp/~ee7k-nsd/
というソフトでも実現していました。
連投ですいません。
(解決チェックも忘れていたので...)
タスクメイド と XPあれ。
の作者さまは環境としてDelphiも使っておられるようですが
http://www2.tbb.t-com.ne.jp/tmsoft/soft.html
グローバルフックやサブクラス化はやってないとかかれていますね。
具体的なやりかたはよくわかりませんが、とりあえず解決としておきます。
解決チェックが入り、横レスで恐縮ですが、
> 後者の「隠す」操作にしても、XP以降はそのようなユーザの好みで設定する箇所を
> プログラムが勝手にいじれないよう「あえて」インタフェースを用意しない方針になってきています。
この、『プログラムが勝手にいじれないよう「あえて」インタフェースを用意しない方針』という部分の、ソースありますか?
例えば、これと同じコトをしたい場合、
KNtfyCln(トレイアイコン履歴の掃除)
ttp://www.vector.co.jp/soft/winnt/util/se408633.html
トレイアイコンの履歴を完全に削除するのではなく、個別に削除できます。
『プログラムが勝手にいじれない』のであれば、やっぱりexplorerの
強制再起動しか方法がないのかなと、あきらめもつくわけで。
ここに詳しい説明がありますが、
ttp://homepage1.nifty.com/kazubon/progdoc/tclock/taskbarhistory.html
以下のようにするとアイコン全体はいじれるみたいです(win2kです)。
参考までに(参考にならないかもしれませんが)。
var
h1, h2, h3: hWnd;
begin
h1 := FindWindow(PChar('Shell_TrayWnd'), nil);
if h1 <> 0 then begin
h2 := FindWindowEx(h1, 0, PChar('TrayNotifyWnd'), nil);
if h2 <> 0 then begin
h3 := FindWindowEx(h2, 0, PChar('ToolbarWindow32'), nil);
if h3 <> 0 then begin
ShowWindow(h3, SW_HIDE);
Application.ProcessMessages;
sleep(1000);
ShowWindow(h3, SW_SHOW);
end;
end;
end;
end;
> この、『プログラムが勝手にいじれないよう「あえて」インタフェースを用意しない方針』という部分の、ソースありますか?
直接のソースというわけではないですが、念頭に置いていたのはこの記事です。
Why is there no programmatic access to the Start menu pin list?
http://blogs.msdn.com/oldnewthing/archive/2003/09/03/54760.aspx
上記のブログでしばしば言われる「もし〜だったら何が起こるか想像してみる」を当てはめると……
トレイアイコンを隠す設定をもしプログラムから簡単に変えられるとしたら、
それはユーザがあるアイコンを「隠す」設定にしたとしてもプログラム側で無効にできる、
あるいは自分自身を「常に表示」設定に昇格できるということを意味します。
ただでさえ用もないのにタスクトレイにアイコンを入れたがる目立ちたがりなアプリが
あふれている現状から考えれば、どういう結果になるかは想像がつくと思います。
で、実際そういうインタフェースを用意する必要性がどれだけあるかと
濫用される可能性を秤にかければ、用意しない方を選ぶのではないでしょうか。
まあ、公式なソースがあるわけではなく、あくまで勝手な想像ですけれど。
Tapさん、素早いレスありがとうございます。
> > この、『プログラムが勝手にいじれないよう「あえて」インタフェースを用意しない方針』という部分の、ソースありますか?
> 直接のソースというわけではないですが、念頭に置いていたのはこの記事です。
> Why is there no programmatic access to the Start menu pin list?
> http://blogs.msdn.com/oldnewthing/archive/2003/09/03/54760.aspx
英文を完全に理解できるほどではありませんが、だいたいわかりました。
Tapさんのおっしゃることも、至極当然のことですね。
「悪用される可能性」という点までは、まったく考慮していませんでした。
ツイート | ![]() |