C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る


(過去ログ 24 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■10965 / inTopicNo.1)  外部アプリを起動したときにタスクバーにタスクバーボタンが残る
  
□投稿者/ Ric (1回)-(2007/12/03(Mon) 12:58:01)

分類:[.NET 全般] 

いつも、参考にさせていただいてます。

.NETのSystem.Diagnostics.Process.Startを使用して、
外部アプリ(タスクバーにタスクボタンを表示しないアプリ)を
起動すると、タスクバーにタスクボタンが表示されてしまいました。

ダブルクリックで起動したり、コマンドプロンプトから
startコマンドで起動したら、タスクボタンは、表示されなかったため、
外部アプリには問題ないかと思っています。
また、外部アプリはVC6で設計しています。
Shell_NotifyIconや、ModifyStyleExを使用して、
消しています。

起動方法は下記の通りです。
System.Diagnostics.ProcessStartInfo psiData;
psiData = new System.Diagnostics.ProcessStartInfo();
psiData.FileName = 外部アプリ名;
System.Diagnostics.Process.Start(psiData);

タスクバーにタスクボタンが表示されないように起動するためには、
何か、設定等が必要でしょうなのでしょうか?

以上、宜しくお願いいたします。

引用返信 編集キー/
■10969 / inTopicNo.2)  Re[1]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る
□投稿者/ 渋木宏明(ひどり) (582回)-(2007/12/03(Mon) 14:19:26)
渋木宏明(ひどり) さんの Web サイト
> 外部アプリ(タスクバーにタスクボタンを表示しないアプリ)を
> 起動すると、タスクバーにタスクボタンが表示されてしまいました。


その外部アプリとやらは、どんなアプリなんでしょうか?
コンソールアプリケーションですか? それとも GUI アプリケーションでしょうか?

> ダブルクリックで起動したり、コマンドプロンプトから
> startコマンドで起動したら、タスクボタンは、表示されなかったため、
> 外部アプリには問題ないかと思っています。

explorer から .exe のダブルクリックで起動したのと、Process.Start() したのとでは、同様の結果になりそうなもんですが。。。

> また、外部アプリはVC6で設計しています。
> Shell_NotifyIconや、ModifyStyleExを使用して、
> 消しています。

何を?メインウィンドウを、ですか?

引用返信 編集キー/
■10971 / inTopicNo.3)  Re[2]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る
□投稿者/ Ric (3回)-(2007/12/03(Mon) 14:47:56)
ご返信ありがとうございます。

>>外部アプリ(タスクバーにタスクボタンを表示しないアプリ)を
>>起動すると、タスクバーにタスクボタンが表示されてしまいました。
> その外部アプリとやらは、どんなアプリなんでしょうか?
> コンソールアプリケーションですか? それとも GUI アプリケーションでしょうか?
すみません。説明不足でした。
ログを吐き出す、常駐アプリです。
GUI(ダイアログ)アプリケーションですが、
画面が必要ないため、起動時にShowWindow関数で、非表示にしています。
他のアプリのタスクバーボタンを非表示にするアプリではないです。

>>ダブルクリックで起動したり、コマンドプロンプトから
>>startコマンドで起動したら、タスクボタンは、表示されなかったため、
>>外部アプリには問題ないかと思っています。
> explorer から .exe のダブルクリックで起動したのと、Process.Start() したのとでは、同様の結果になりそうなもんですが。。。
再度確認しましたが、
やはりProcess.Start()した場合のみ、タスクバーボタンが表示されてしまいました。

>>また、外部アプリはVC6で設計しています。
>>Shell_NotifyIconや、ModifyStyleExを使用して、
>>消しています。
> 何を?メインウィンドウを、ですか?
外部アプリのタスクバーボタンを消しています。

以上、宜しくお願い致します。
引用返信 編集キー/
■10981 / inTopicNo.4)  Re[3]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る
□投稿者/ 渋木宏明(ひどり) (584回)-(2007/12/03(Mon) 16:44:46)
渋木宏明(ひどり) さんの Web サイト
> GUI(ダイアログ)アプリケーションですが、
> 画面が必要ないため、起動時にShowWindow関数で、非表示にしています。

起動時、というのはもっと細かく言うとどこでですか?

メインウィンドウの Form.Load() とかです?
確か、Form.Load() を抜けた後に本格的に表示されるので、Form.Load() で非表示かするのはうまく機能しなかったような。

ちなみに、Form.Load() で Form.Visible = true してもうまくいかないことの対策なら、Form.Load() で this.BeginInvoke(this.Hide) って手もあるかと。

> やはりProcess.Start()した場合のみ、タスクバーボタンが表示されてしまいました。

「ウィンドウを持っている」ならそうなる可能性もあるかもしれませんね。

そもそもウィンドウ表示がまったくいらないなら、メインウィンドウなんか出さずに Program.Main() 配下に必要な処理を書けばいいんじゃないですか?

それがどーしても出来ないって話なら、Form.ShowInTaskBar = false してみるとか。

引用返信 編集キー/
■10983 / inTopicNo.5)  Re[4]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る
□投稿者/ Ric (4回)-(2007/12/03(Mon) 18:13:47)
すみません。大事なことをひとつ言い忘れていました。
外部アプリは、VC6で設計していますので、.NETアプリではありません。

>>GUI(ダイアログ)アプリケーションですが、
>>画面が必要ないため、起動時にShowWindow関数で、非表示にしています。
> 起動時、というのはもっと細かく言うとどこでですか?
> メインウィンドウの Form.Load() とかです?
> 確か、Form.Load() を抜けた後に本格的に表示されるので、Form.Load() で非表示かするのはうまく機能しなかったような。
InitInstance()と、OnPaint()で呼び出しています。

>>やはりProcess.Start()した場合のみ、タスクバーボタンが表示されてしまいました。
> 「ウィンドウを持っている」ならそうなる可能性もあるかもしれませんね。
InitInstance()や、OnPaint()のイベントの後にタスクバーボタンが表示する処理が走ってる可能性がある
ということでしょうか?

> そもそもウィンドウ表示がまったくいらないなら、メインウィンドウなんか出さずに
> Program.Main() 配下に必要な処理を書けばいいんじゃないですか?
そうですね。
ただ、常駐アプリがほぼ完成してしまっているので、
マイナーチェンジでなんとかできるなら、やってしまおうと思っていたので・・・
CWinApp::Run関数内で行ってしまった方が早そうですね。

以上、宜しくお願い致します。
引用返信 編集キー/
■10985 / inTopicNo.6)  Re[5]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る
□投稿者/ 渋木宏明(ひどり) (585回)-(2007/12/03(Mon) 18:43:36)
渋木宏明(ひどり) さんの Web サイト
> InitInstance()と、OnPaint()で呼び出しています。

てことは MFC ですよね?

MDI ってこた無いと思いますが、SDI/ダイアログアプリのどちでしょう?

遠い記憶になりつつありますが、ウィンドウが表示されまでの記述がちょっと違いませんでしたっけ? > SDI/ダイアログアプリ

OnPaint() で表示の制御するのはダサイっすよ。

SDI だと、InitInstance() の最後の方で Show() しないとか、そんな感じで制御できたんじゃなかったかな?

ダイアログアプリって CDialog::DoModal() してるんでしたっけ?

ダイアログリソースで非表示に設定していても、DoModal() が強制的にダイアログを表示してしまったような気が。

> InitInstance()や、OnPaint()のイベントの後にタスクバーボタンが表示する処理が走ってる可能性がある
> ということでしょうか?

OnPaint() でどーこーしたことないのでそっちは分かりませんが、ウィザードが吐いた CWinApp::InitInstance() のオーバーライドには、プロセスの起動オプション(=コマンドライン引数ではありません)を解析して、nCmdShow の値を設定しているところがあるはずです。

ウィザードが吐いたコードでは、この nCmdShow の値をメインウィンドウの「表示/非表示」に使っているので、↑で書いたように、これを無視して常にメインウィンドウを表示させないで InitInstance() を抜けて帰るコード書けばおkだったような気がします。

引用返信 編集キー/
■10991 / inTopicNo.7)  Re[6]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る
□投稿者/ Ric (5回)-(2007/12/03(Mon) 21:36:42)
解決できました。
ありがとうございました。

>>InitInstance()と、OnPaint()で呼び出しています。
> てことは MFC ですよね?
MFCです。

> MDI ってこた無いと思いますが、SDI/ダイアログアプリのどちでしょう?
ダイアログアプリです。

> OnPaint() で表示の制御するのはダサイっすよ。
> SDI だと、InitInstance() の最後の方で Show() しないとか、そんな感じで制御できたんじゃなかったかな?
> ダイアログアプリって CDialog::DoModal() してるんでしたっけ?
> ダイアログリソースで非表示に設定していても、DoModal() が強制的にダイアログを表示してしまったような気が。
DoModal()しています。
ダイアログを表示しないで、タスクボタンを表示しないようにしようとしましたが、
タスクトレイにアイコン表示をしないといけないため、
ウィンドウハンドルを渡す必要があり、CWinAppクラスでは出来ないと判断し、
ダイアログベースで作ったのかもしれません。
(サンプルを見て作ったので、何も考えずに作ってしまいました。)

>>InitInstance()や、OnPaint()のイベントの後にタスクバーボタンが表示する処理が走ってる可能性がある
>>ということでしょうか?
> OnPaint() でどーこーしたことないのでそっちは分かりませんが、
> ウィザードが吐いた CWinApp::InitInstance() のオーバーライドには、
> プロセスの起動オプション(=コマンドライン引数ではありません)を解析して、nCmdShow の値を設定しているところがあるはずです。
> ウィザードが吐いたコードでは、この nCmdShow の値をメインウィンドウの「表示/非表示」に使っているので、↑で書いたように、これを無視して常にメインウィンドウを表示させないで InitInstance() を抜けて帰るコード書けばおkだったような気がします。
非表示で起動するには、下記のプロパティを設定することによって、解決できました。
psiData.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
おそらくですが、教えていただいたnCmdShowの値を書き換えている気がします。

また、リソースのプロパティを変更することにより、タスクバーボタンを削除できました。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TaskTray.html

外部アプリの作りが悪くて現象が出ていましたが、
何故、実行ファイルのダブルクリックでの実行で出来て、
Process.Start()メソッドで出来なかったのかが、はっきりした理由はわかりませんが、
確実に?解決できたの良かったです。

ありがとうございました。

以上、宜しくお願い致します。

解決済み
引用返信 編集キー/
■10993 / inTopicNo.8)  Re[7]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る
□投稿者/ 渋木宏明(ひどり) (586回)-(2007/12/03(Mon) 22:12:05)
渋木宏明(ひどり) さんの Web サイト
>DoModal()しています。

ウィザードが吐きだしたコードだとそうなりますよね。

が、ダイアログを SDI の CMainForm のように扱って、DoModal() しないダイアログアプリを作ることも可能です。

> また、リソースのプロパティを変更することにより、タスクバーボタンを削除できました。
> http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TaskTray.html

WS_EX_TOOLWINDOW って、ダイアログエディタで指定できましたっけ?

次回、ダイアログエディタで開いて(編集して?)保存した時に消えてしまうかもしれないので、.rc ファイルの手書きでの修正はあまりしない方がよろしいかと。

同じページにある、CDialog::OnInitDialog() で ModifyStyleEx() するんでは駄目でしたか?
これがうまくいかない、というのが当初の OnInitInstance() 云々というコトなんでしょうか?

>psiData.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
>おそらくですが、教えていただいたnCmdShowの値を書き換えている気がします。

そうなりますが、ダイアログアプリの場合これがどう効いてくるのか僕は確認したことがありません。

↑に書いたように、ダイアログアプリの起動シーケンスを書きなおして「ダイアログを CMainForm のように扱う」ようにすれば、何をやっているのかはっきり分かるようになります。

>確実に?解決できたの良かったです。

結局、ダイアログに WS_EX_TOOLWINDOW スタイルを追加する方向で解決したんですよね?

「常にウィンドウが表示されない状態」を得るのが目的ある場合、運用形態によっては「起動する側」のコードを書き変えただけでは片手落ちになりかねません。
(ランチャから常駐アプリを起動した場合など)
引用返信 編集キー/
■11008 / inTopicNo.9)  Re[8]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る
□投稿者/ Ric (6回)-(2007/12/04(Tue) 11:18:54)
ご返信ありがとうございます。

> >DoModal()しています。
> ウィザードが吐きだしたコードだとそうなりますよね。
> が、ダイアログを SDI の CMainForm のように扱って、DoModal() しないダイアログアプリを作ることも可能です。
> ↑に書いたように、ダイアログアプリの起動シーケンスを書きなおして「ダイアログを CMainForm のように扱う」ようにすれば、
> 何をやっているのかはっきり分かるようになります。
確かにそうですね。
現状あまり時間がないため、試せないのですが、
次回は、綺麗に書けるようにしたいです。

>>また、リソースのプロパティを変更することにより、タスクバーボタンを削除できました。
>>http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TaskTray.html
> WS_EX_TOOLWINDOW って、ダイアログエディタで指定できましたっけ?
ダイアログプロパティの拡張スタイルのツールウィンドウをチェックすると出来ました。

> 次回、ダイアログエディタで開いて(編集して?)保存した時に消えてしまうかもしれないので、
> .rc ファイルの手書きでの修正はあまりしない方がよろしいかと。
ほんまですね。
次回、気をつけます。

> 同じページにある、CDialog::OnInitDialog() で ModifyStyleEx() するんでは駄目でしたか?
> これがうまくいかない、というのが当初の OnInitInstance() 云々というコトなんでしょうか?
ModifyStyleEx()をOnInitInstance()で呼んでも出来ませんでした。

> >psiData.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
> >おそらくですが、教えていただいたnCmdShowの値を書き換えている気がします。
> そうなりますが、ダイアログアプリの場合これがどう効いてくるのか僕は確認したことがありません。
動作自体は問題ありませんでした。

> >確実に?解決できたの良かったです。
> 結局、ダイアログに WS_EX_TOOLWINDOW スタイルを追加する方向で解決したんですよね?
ダイアログに WS_EX_TOOLWINDOW スタイルを追加する方向で解決しました。

> 「常にウィンドウが表示されない状態」を得るのが目的ある場合、
> 運用形態によっては「起動する側」のコードを書き変えただけでは片手落ちになりかねません。
> (ランチャから常駐アプリを起動した場合など)
今回の課題で身にしみました。
今回はWindows起動してからシャットダウンするまでの常駐するアプリなので、
サービスで登録して実行してあげた方が、賢かったかもしれません。

以上、宜しくお願い致します。

引用返信 編集キー/
■11011 / inTopicNo.10)  Re[9]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る
□投稿者/ 渋木宏明(ひどり) (587回)-(2007/12/04(Tue) 11:40:13)
渋木宏明(ひどり) さんの Web サイト
>>WS_EX_TOOLWINDOW って、ダイアログエディタで指定できましたっけ?
> ダイアログプロパティの拡張スタイルのツールウィンドウをチェックすると出来ました。

ダイアログエディタがサポートしてるんなら大丈夫ですね>WS_EX_TOOLWINDOW

> 今回はWindows起動してからシャットダウンするまでの常駐するアプリなので、
> サービスで登録して実行してあげた方が、賢かったかもしれません。

そうかもしれませんね (^^;

引用返信 編集キー/
■11014 / inTopicNo.11)  Re[10]: 外部アプリを起動したときにタスクバーにタスクバーボタンが残る
□投稿者/ Ric (7回)-(2007/12/04(Tue) 11:55:45)
.NET圏外のスレッドになってしまい、それでも回答いただき助かりました。
本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -