タスクリストに非表示

解決


Dels  2012-11-05 03:33:45  No: 43310

いつもお世話になります。
以下のコードをProject1.dprに追加しForm1からForm2を
呼び出しています。
Form2は選択可能なフォームにしています。
Form1起動時は、タスクマネージャーのアプリケーション
に表示されませんが、Form2を表示するとアプリケーション
に表示されます。
やりたいことは、Form2を表示されないようにするか、
アプリケーションでタスクの終了を押された場合にも
Form1(Project1)が終了しないようにしたいのですが?
Form2で強制終了されると終了時の処理が実行できない
ためです。
何か良い方法はないでしょうか?
以前WinXpSp2では表示されていませんでしたので、OS側の
問題でしょうか?
よろしくお願いします。

環境WinXpSp3+ Delphi

program Project1;
uses
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
   SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Mr.XRAY  2012-11-06 02:54:40  No: 43311

こんにちは.

>アプリケーションでタスクの終了を押された場合にも

の時も,アプリの検出する方法はあると思いますが,

>Form1起動時は、タスクマネージャーのアプリケーション
>に表示されませんが、

ということは,サービスアプリケーションなのでしょうか ?
多分,サービスアプリケーションでも,終了を検出できるとは思うのですが,
確認はしていません.


Mr.XRAY  2012-11-06 02:58:02  No: 43312

>の時も,アプリの検出する方法はあると思いますが,

失礼.「アプリの終了を検出する方法」ですね.


Dels  2012-11-06 08:24:10  No: 43313

Mr.XRAYさんありがとうございます。
サービスアプリケーションではなくTasktrayアプリ?です。
CoolTrayICON4.4.0(http://subsimple.com/delphi.asp
を使用して時間がきたらForm1、Form2〜5を順次表示します。
Form1(TrayIconのフォーム)これはタスクマネージャーには
表示されません。
Form2〜5(選択可能なフォーム  Form1(Unit1)から呼ばれます。
このForm2〜5を非表示にしたいのですが?
どうでしょうか?
よろしくお願いします。


KHE00221  2012-11-06 10:32:23  No: 43314

タスクの終了は強制終了じゃない


Mr.XRAY  2012-11-06 10:50:19  No: 43315

こんにちは.

残念ですが,私の頭脳では.理解できません.
最初の文章からは,アプリを,タスクマネージャに表示したくないから,

>CoolTrayICON4.4.0(http://subsimple.com/delphi.asp

を使ったようにも読み取れました.
が,一方で,アプリが終了(例えばタスクマネージャー等)で終了された時も,
何らかの処理をしたいから,とも受け取れました.

次の発言では,

>このForm2〜5を非表示にしたいのですが?

非表示にすることとの関連も理解できません.
非表示にしたければ,表示しなければいいのではとも思ってしまいます.
(眠いせいかも知れませんが)

>CoolTrayICON4.4.0(http://subsimple.com/delphi.asp

は,著名なコンポーネントなのかも知れませんが,少なくても私は知りません.

http://ht-deko.minim.ne.jp/tech045.html#tech095


Mr.XRAY  2012-11-06 20:27:53  No: 43316

こんにちは,

最初の発言で,私が思いついたのは,

>新規にフォームを作成してもタスクバーに表示させないようにするには
>https://www.petitmonte.com/bbs/answers?question_id=7795

と同じ動作で,しかもアプリの終了時(自アプリ以外からも含めて)に何かしらの
処理を行えれば,タスクマネージャに表示されてもいいのでは,と考えました.
しかし,

>CoolTrayICON4.4.0(http://subsimple.com/delphi.asp

にどういう役割をさせているのかが不明ですので,何とも言えません.
たとえ,タスクマネージャーに表示されなくても,

「他のアプリを強制的に終了させるにはどうしたらいいのか」

という質問もあるぐらいですから,
この点は,どうなんでしょう.


Mr.XRAY  2012-11-07 07:04:40  No: 43317

もう1つ分からないことがありますね.

>Form2で強制終了されると終了時の処理が実行できない
>ためです。

この「強制終了」というのは,具体的にどのような操作を意味しているのでしょう.


Mr.XRAY  2012-11-07 07:07:23  No: 43318

それと,Delphi のバージョンですね.
前に提示した,この掲示板のスレッドにも書いてありますが,
バージョンによっては,使えないコードもあります.


Quest  2012-11-07 12:41:12  No: 43319

えーと、まとめると
1.Delphi***でタスクトレイに常駐するアプリを作った(通常はフォームを表示していない)
2.そのアプリはあるタイミングでフォームをいくつか表示する
3.そのアプリはどの状態でも(フォームを表示していてもいなくても)
    タスクマネージャーのアプリケーションタブにWinXPでは表示されない
4.Windows7で(Vistaでも)実行するとフォームを表示している時は
    タスクマネージャーのアプリケーションタブに表示されてしまう
5.そこでアプリケーションの終了を行うと(非表示の)メインフォームの
    終了時の後処理が実行されないので不都合がある
で、要望として5の状況を回避したいので、フォームを表示していても
タスクマネージャーのアプリケーションにリストアップされない
あるいは、タスクマネージャーから終了を選択されても無視するようにできないか?
と、こんな感じでしょうか?

Delphi2007で簡単な検証プログラムを作ってVistaで実行してみました。
Form1(メインフォーム)に標準のタスクトレイコンポを置いて、
Form1は起動時に非表示でタスクバーにも表示しないようにする。
トレイアイコンを右クリックし、メニュー選択から別フォームForm2をモーダル表示する。
(そのためのPopupMenuなどは適に設定)
で、一番手抜きの状態では、Form1のOnCreateで
Application.ShowMainForm := False;//メインフォームの非表示
を実行し、
Form2のBorderStyleプロパティをbsToolWindowにしただけで
Form2を表示しても、タスクマネージャーのアプリケーションに
表示されなくなりました。
Windows7、XPでも同じEXEで確認できました。
ただし、タスクマネージャーのプロセスには表示されるので
こちらからは終了できてしまいますが。


Mr.XRAY  2012-11-07 21:24:16  No: 43320

こんにちは.Quest さん.

なるほど,タスクトレイに常駐するアプリなんですね.う〜む.

>CoolTrayICON4.4.0(http://subsimple.com/delphi.asp

のコンポーネント名で気づくべきでした.
でも,おかげで,もやもやしていたものがスッキリしました.
ありがとうございます.


Mr.XRAY  2012-11-07 21:56:46  No: 43321

ついでに,

>Delphi2007で簡単な検証プログラムを作ってVistaで実行してみました。

おそらく,Delphi 2007 よりも前だと,アプリケーションウィンドウに対する
対策が必要ではないかと思われます.゜

[アプリケーションウィンドウに対する対処 (1)]
http://ddev.blog46.fc2.com/blog-entry-66.html

[アプリケーションウィンドウに対する対処 (4)]
http://ddev.blog46.fc2.com/blog-entry-70.html#more

[AppWinFix]
http://delfusa.main.jp/delfusafloor/opensource/delfusa_library_f.html

[Delphiで、Windows Vista Readyアプリケーションを作る]
http://edn.embarcadero.com/article/33747

間違っていたらゴメンなさい.


Dels  2012-11-08 04:15:17  No: 43322

Mr.XRAY様、Quest様ありがとうございます。
バージョンを書くのを忘れすみませんでした。
今更ながらWinXPSP3  Delphi7です。(アプリの環境もXPSP3)
内容的にはQuest様の記述の通りで、Forom1で
Application.ShowMainForm := False;//メインフォームの非表示し
タスクトレイに常駐、別フォームForm2をある時間がきたら
モーダル表示するというものでした。
bsToolWindowにForm2〜5はしていますが、やはりでていまいます。
一度、MrXrayさんの方法や、XE2で作成してみます。


Nov  2012-11-08 04:49:59  No: 43323

bsToolWindowにしていても、拡張スタイルのWS_EX_APPWINDOWが有効になっていると、タスクマネージャーのアプリケーションに表示されるかも。
http://msdn.microsoft.com/ja-jp/library/cc410714.aspx


Dels  2012-11-08 07:40:54  No: 43324

XE2で作成してみましたが、結果は同じでした。
WS_EX_APPWINDOWは有効になっていません。
ただ、同じプログラムをWin7Sp1で動作させると表示は
されません。
現在確認したのは、Xp  Sp2  非表示
                  Xp  Sp3  表示  
                  Win7Sp1  非表示
う〜んなぜでしょうか?
[アプリケーションウィンドウに対する対処 (4)]
http://ddev.blog46.fc2.com/blog-entry-70.html#more
を試してみたいと思います。


Mr.XRAY  2012-11-08 23:11:03  No: 43325

>Form1(メインフォーム)に標準のタスクトレイコンポを置いて、

これは,確か,Delphi 2006 以降だったと思いますが,TTrayIcon という名前です.
既に開発済みのアプリを変更するのは大変ですが,
新規に作成する方の参考として.補足しておきます.

[Vcl.ExtCtrls.TTrayIcon]
http://docwiki.embarcadero.com/Libraries/XE3/ja/Vcl.ExtCtrls.TTrayIcon

コンポーネントのタブは,... 検索機能があるのでいいでしょう.


Dels  2012-11-09 07:05:49  No: 43326

Mr.XRAYさんありがとうございます。
TtrayIconでも試してみます。


通りすがり  2012-11-13 02:15:22  No: 43327

タスクバーに表示しなくてもよさそうなので、タイトルを空にしてみてはどうだろうか?
Application.Title := '';
一応、XP SP3でもタスクの一覧に表示されないようだ。


Dels  2012-11-26 05:56:09  No: 43328

通りすがりさんありがとうございます。
表示されなくなりました。
やはりSP3になってからのWindowsの変更?でしょうか?
Delphi7からXE2やXE3等の最新版に変更する時期がきた
ようです。


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

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






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