お世話になります。
タスクトレイに常駐するアプリを作成しています。
メインフォームをタスクバーに表示させないようにする事は出来たのですが、そのメインフォームで新規に別のフォームを作成しshowさせると、タスクバーにその新規フォームが表示されてしまいます。
これを防ぐ手立てはありますでしょうか?
よろしくお願いします。
>タスクバーに表示させないようにする事は出来たのですが
どのようにやったのかも,環境も分かりせんが,試してみました.
(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
添付のものは,Delphi 2007 以降用です.
Delphi 6 や 7 では,コンパイル時にエラーは発生しませんが,
タスクバーにアイコンが表示されます.
ご返信ありがとうございます。
テストアプリまで用意していただいて、とてもありがたいです。
動かしてみたら確かに表示されませんでした。ということは私のコードがおかしいんですね。
>環境も分かりせん
失礼しました。
環境は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内で何らかの処理を走らせるのが普通なのでしょうか?
よろしくお願いします。
どんな事がやりたいのかが見えないので情報だけですが。
http://katsura-kotonoha.sakura.ne.jp/prog/win/tip00034.shtml
Windowsの作法ですので、この条件外での実装は結構たいへんです。
>その作成するフォームのCreate内で何らかの処理を走らせるのが普通なのでしょうか?
いえ,そうではなく,Delphi のバージョンによってコーディングが違うということです.
参考記事を失念してしまったので,探しています.
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);
と変更したところ、フォームを作成してもステータスバーに表示されることはなくなりました。
よく考えたらプロジェクトソース内でメインフォームを作成しようが、サブのフォームを作成するのはメインフォームなのですから、メインフォーム側で設定してやらないとダメですよね。
プロジェクトソース内でウインドウ設定をした場合、その設定が適応されるのはソース内で作成されたフォームに限られてしまうようです。てっきりプロジェクトソースでアプリケーション作成時に設定しておけば、そのあと作られるフォーム全体に適応されるものだと思っていました。
なんか自己解決みたいな形になってしまい申し訳ないですが、取りあえず解決にしておきます。
何か突っ込み等がありましたらお願いします。
>参考記事を失念してしまったので,探しています.
はい,見つかりました.
ツイート | ![]() |