新規にフォームを作成してもタスクバーに表示させないようにするには

解決


KGK  2012-10-17 02:46:52  No: 43204

お世話になります。
タスクトレイに常駐するアプリを作成しています。
メインフォームをタスクバーに表示させないようにする事は出来たのですが、そのメインフォームで新規に別のフォームを作成しshowさせると、タスクバーにその新規フォームが表示されてしまいます。
これを防ぐ手立てはありますでしょうか?
よろしくお願いします。


Mr.XRAY  2012-10-17 04:58:37  No: 43205

>タスクバーに表示させないようにする事は出来たのですが

どのようにやったのかも,環境も分かりせんが,試してみました.

(1) 新規プロジェクトを作成し,これをメインフォームとする
(2) OnFormCreate イベントに,タスクバーにアイコンを表示しないコードを書く
(3) フォームを追加,Form2 とする
(4) 更にフォームを追加.Form3 とする.これは自動生成から除外して,実行時生成とする

メインフォームから,ボタンクリックで,Form2, Form3 を表示しましたが,
私のコードでは,タスクバーにアプリケーションのアイコンも,フォームも
アイコンも表示しませんでした.

動作確認環境は,Windows XP(SP3) + Delphi XE Pro と
Windows 7 U64(SP1) + Delphi XE です.

http://mrxray.on.coocan.jp/Delphi/zipothers/NoVisibleTaskBarTest.zip


Mr.XRAY  2012-10-17 05:08:46  No: 43206

添付のものは,Delphi 2007 以降用です.
Delphi 6 や 7 では,コンパイル時にエラーは発生しませんが,
タスクバーにアイコンが表示されます.


KGK  2012-10-17 17:57:09  No: 43207

ご返信ありがとうございます。
テストアプリまで用意していただいて、とてもありがたいです。
動かしてみたら確かに表示されませんでした。ということは私のコードがおかしいんですね。

>環境も分かりせん
失礼しました。
環境はWindows7(64bit)+Delphi2007です。

>OnFormCreate イベントに,タスクバーにアイコンを表示しないコードを書く

すでにこの時点で違っていますね。
私はプロジェクトのソース内で

  Application.Initialize;
  Application.ShowMainForm  :=  False;
  Application.MainFormOnTaskbar := False;
  Application.Title := 'タイトル';
  Application.CreateForm(TForm1, Form1);
   ShowWindow(Application.Handle, SW_HIDE);
  //アプリケーションのウィンドウを(タスクバーに)表示しない
  SetWindowLong(Application.Handle, GWL_EXSTYLE,
    GetWindowLong(Application.Handle, GWL_EXSTYLE) or     
    WS_EX_TOOLWINDOW);

みたいにしてフォームを作成しています。
タスクトレイに常駐するプログラムのサンプルソースをそのまま使ったので、何か勘違いしてしまっているみたいです。
タスクバーに表示させないようにする場合は、その作成するフォームのCreate内で何らかの処理を走らせるのが普通なのでしょうか?
よろしくお願いします。


monaa  2012-10-17 22:56:46  No: 43208

どんな事がやりたいのかが見えないので情報だけですが。
http://katsura-kotonoha.sakura.ne.jp/prog/win/tip00034.shtml
Windowsの作法ですので、この条件外での実装は結構たいへんです。


Mr.XRAY  2012-10-17 23:13:23  No: 43209

>その作成するフォームのCreate内で何らかの処理を走らせるのが普通なのでしょうか?

いえ,そうではなく,Delphi のバージョンによってコーディングが違うということです.
参考記事を失念してしまったので,探しています.


KGK  2012-10-17 23:52:53  No: 43210

monaaさん、Mr.XRAYさんご返信ありがとうございます。
すみません。なんとかできました。
貰った情報を頼りにいろいろといじってみたところ、SetWindowLongの設定が悪かったようです。
プロジェクトソースで

  ShowWindow(Application.Handle, SW_HIDE);
  SetWindowLong(Application.Handle, GWL_EXSTYLE,
    GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);

としていたのを、Mr.XRAYさんが書かれたようにメインフォームのOnCreate内に移し、

  SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);

と変更したところ、フォームを作成してもステータスバーに表示されることはなくなりました。
よく考えたらプロジェクトソース内でメインフォームを作成しようが、サブのフォームを作成するのはメインフォームなのですから、メインフォーム側で設定してやらないとダメですよね。
プロジェクトソース内でウインドウ設定をした場合、その設定が適応されるのはソース内で作成されたフォームに限られてしまうようです。てっきりプロジェクトソースでアプリケーション作成時に設定しておけば、そのあと作られるフォーム全体に適応されるものだと思っていました。

なんか自己解決みたいな形になってしまい申し訳ないですが、取りあえず解決にしておきます。
何か突っ込み等がありましたらお願いします。


Mr.XRAY  2012-10-18 02:05:06  No: 43211

>参考記事を失念してしまったので,探しています.

はい,見つかりました.

[秘密のウィンドウに対する対処]
http://edn.embarcadero.com/article/33747#4%E7%A7%98%E5%AF%86%E3%81%AE%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E5%AF%BE%E5%87%A6


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

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






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