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

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

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

Re[2]: タスクトレイからのアイコンの削除


(過去ログ 156 を表示中)

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

■90432 / inTopicNo.1)  タスクトレイからのアイコンの削除
  
□投稿者/ usushio (13回)-(2019/03/11(Mon) 13:55:56)

分類:[VB.NET/VB2005 以降] 

visualstudio2017 VBで開発を行っております。

アプリケーションからTeamViewerの起動と終了を行えるようなプログラムを作成しています。

Process.Start("C:\Program Files (x86)\TeamViewer\TeamViewer.exe")
でTeamViewerの起動を行い

Dim ps As Process() = Process.GetProcessesByName("Teamviewer")
For Each p As Process In ps
p.Kill()
Next
終了時にはこのようなコマンドで終了させています。

この動作自体は行えるのですが、TeamViewerを終了し、再び起動を行った際に
タスクトレイからアイコンが消えずアイコンがどんどんと増えていきます。
しかし、マウスカーソルを重ねるとアイコンは消え、一つだけの表示に戻ります。

プロセスをKillさせるのがよろしくないのでしょうか?
それとも終了プロセス手順がよろしくないのでしょうか?


引用返信 編集キー/
■90433 / inTopicNo.2)  Re[1]: タスクトレイからのアイコンの削除
□投稿者/ 774RR (673回)-(2019/03/11(Mon) 14:17:09)
Kill (TerminateProcess) は後始末をする余裕も与えず抹消する、の意味なので、
タスクトレイ中のアイコンを削除する後始末なしにプロセスが抹消されてアイコンが残ってしまう、という動作をします。
なので kill するのが悪い。
http://uno036.starfree.jp/PRGmanual/vsnet_tips/process/kill.html

後始末つきで正しく終了させると、その現象は起こらないでせう。
どうすれば「正しい終了」なのかはプログラムによって違うので何とも言えないっす。
http://uno036.starfree.jp/PRGmanual/vsnet_tips/process/closemainwindow.html
この方法でうまくいくかもしれないし、いかないかもしれないっす。お試しあれ。

引用返信 編集キー/
■90435 / inTopicNo.3)  Re[2]: タスクトレイからのアイコンの削除
□投稿者/ usushio (15回)-(2019/03/11(Mon) 15:00:28)
No90433 (774RR さん) に返信
> Kill (TerminateProcess) は後始末をする余裕も与えず抹消する、の意味なので、
> タスクトレイ中のアイコンを削除する後始末なしにプロセスが抹消されてアイコンが残ってしまう、という動作をします。
> なので kill するのが悪い。
> http://uno036.starfree.jp/PRGmanual/vsnet_tips/process/kill.html
>
> 後始末つきで正しく終了させると、その現象は起こらないでせう。
> どうすれば「正しい終了」なのかはプログラムによって違うので何とも言えないっす。
> http://uno036.starfree.jp/PRGmanual/vsnet_tips/process/closemainwindow.html
> この方法でうまくいくかもしれないし、いかないかもしれないっす。お試しあれ。
>

ウィンドウを終了しても、タスクアイコンにあるアイコンから終了を行わないと完全には終了しないアプリケーション
(例えば、skypeとか)も終了の手順は同様の方法で行っても問題はないのでしょうか。
引用返信 編集キー/
■90436 / inTopicNo.4)  Re[3]: タスクトレイからのアイコンの削除
□投稿者/ 774RR (674回)-(2019/03/11(Mon) 15:51:16)
「同様」がどっちの話か分からないけど「メインウインドウ」を閉じることだとして

終了とは? の定義次第ぢゃないっすか?
普通のアプリは、メインウインドウを閉じる=終了、タスクマネージャ上の表示消滅、だけど、
ウインドウを閉じてもタスクマネージャ上 EXE が残っているアプリの終了はあなたがどう考えるか次第っす。
・画面上に姿が現れないし実害ないなら実質終了と考えてもよいし
・タスクマネージャ上 EXE が残っていたら終了してないと考えてもよいし
考え方というか求められている案件次第。

ただ後始末なしで終了させる、すなわち Kill すると、
タスクバー上のアイコン以外にもいろいろ不都合が発生するであろうことはほぼ間違いないっす。
実験してないけど Skype を Kill (して成功) したなら在席のままになっているとかありそう。

なぜに「終了させなければならない」のか、その辺の案件から再検討だと思う。
引用返信 編集キー/
■90437 / inTopicNo.5)  Re[1]: タスクトレイからのアイコンの削除
□投稿者/ 魔界の仮面弁士 (2097回)-(2019/03/11(Mon) 16:23:40)
No90432 (usushio さん) に返信
> アプリケーションからTeamViewerの起動と終了を行えるようなプログラムを作成しています。
自分の手元にある TeamViewer ライセンスは相当古いバージョンなので、
現行バージョンの TeamViewer における、正しい終了方法は分からないです。


> p.Kill()
Kill は強制終了ですので、アプリケーションによっては、
一時ファイルのクリーンアップが行われなかったりだとか、
リソースの解放が正しい手順で行われないなどの問題を生じる可能性があります。


> マウスカーソルを重ねるとアイコンは消え、一つだけの表示に戻ります。
強制終了でお茶を濁しつつ、トレイに対してマウス通知を投げて消していく、という後ろ向きな方法とか。


No90435 (usushio さん) に返信
> ウィンドウを終了しても、タスクアイコンにあるアイコンから終了を行わないと完全には終了しないアプリケーション
安全に終了させる方法は、『それぞれのアプリ側の実装』に依存する話なので、
あらゆるアプリに共通する手段はありません。


ですがまずは、CloseMainWindow で要件を満たせるかどうかを試してみる価値はあると思いますよ。
終了させられるかどうかは保証できないのですが、少なくとも Kill するよりは安全な方法と言えます。


> (例えば、skypeとか)も終了の手順は同様の方法で行っても問題はないのでしょうか。
Skype はストア版、デスクトップ版など新旧幾つかのバージョンがあり、終了のさせ方はそれぞれで異なります。
たとえば、メインウィンドウを × で閉じるのではなく、"Skepe の終了" メニューを選択する必要があるものなど。



Dim p = Process.Start("notepad.exe")
MsgBox("メモ帳を編集した後、この MsgBoxを閉じてください", MsgBoxStyle.SystemModal)
If p.HasExited Then
  MsgBox("既に閉じられていた", MsgBoxStyle.SystemModal)
ElseIf p.CloseMainWindow() Then
  MsgBox("閉じられた", MsgBoxStyle.SystemModal)
Else
  MsgBox("閉じなかった", MsgBoxStyle.SystemModal)
End If


たとえば上記でメモ帳を開いて編集し、最初の MsgBox を閉じると、
編集中の内容をファイルに保存するかどうかを
メモ帳がダイアログで問い合わせてきます。

ダイアログに「キャンセル」と答えた場合、メモ帳は閉じられません。
しかし CloseMainWindow ではその違いを判定できずに、VB 側では
「閉じられた」のメッセージが表示されたりします。


一方、p.CloseMainWindow を使わずに、p.Kill で終了させた場合は、
本来行われるべき、この確認ダイアログが表示されなくなります。
引用返信 編集キー/
■90553 / inTopicNo.6)  Re[2]: タスクトレイからのアイコンの削除
□投稿者/ usushio (16回)-(2019/03/20(Wed) 17:26:06)
返信が遅くなってしまいました。

返答ありがとうございます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -