質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

11814閲覧

C# WindowをHideするとCloseしてしまう

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/02/18 10:23

こんにちは。
Windows10でWindows Formのアプリケーションを開発しています。
Visual Studio 2015 Communityを使っています。

###前提・実現したいこと
タスクトレイに常駐したアイコンをクリックして、メインフォームの表示/非表示を切り替えたいと考えました。

###発生している問題・エラーメッセージ
ところが、Hide()すると、非表示になるのではなく、ウィンドウを閉じてしまいます。
非表示にする方法を教えてください。

###該当のソースコード

C#

1 public void SetTaskTray() { 2 //タスクバーに表示しない 3 ShowInTaskbar = false; 4 5 //タスクトレイアイコンを初期化する 6 notifyIcon = new System.Windows.Forms.NotifyIcon(); 7 8 //タスクトレイに表示する 9 notifyIcon.Visible = true; 10 11 //アイコンにコンテキストメニュー「終了」を追加する 12 var menuStrip = new System.Windows.Forms.ContextMenuStrip(); 13 14 var exit = new System.Windows.Forms.ToolStripMenuItem(); 15 exit.Text = "終了"; 16 menuStrip.Items.Add(exit); 17 exit.Click += new System.EventHandler(OnExit); 18 19 //ContextMenuを登録する。 20 notifyIcon.ContextMenuStrip = menuStrip; 21 22 //タスクトレイアイコンにクリックイベントハンドラを登録する 23 notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(OnNotifyIconClick); 24 } 25 26 27 bool IsShown = true; 28 private void OnNotifyIconClick(object sender, System.Windows.Forms.MouseEventArgs e) { 29 try { 30 if (e.Button == System.Windows.Forms.MouseButtons.Left) { 31 if (IsShown) { 32 //this.Hide(); 33 IsShown = false; 34 } 35 //ウィンドウを可視化 36 else { 37 this.Show(); 38 IsShown = true; 39 } 40 } 41 } 42 catch(Exception exception) { 43 string error = exception.Message; 44 } 45 } 46

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2015
Version 14.0.25424.00 Update 3
Microsoft .NET Framework
Version 4.6.01038

インストールしているバージョン:Community

Visual C# 2015 00322-20000-00000-AA575
Microsoft Visual C# 2015

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

FormClosedイベントを追加して動作を確認してみたのですが、Closedイベントが発生しませんでした。
終了メニューをクリックしての終了時は発生します。

確認ソース

C#

1 public partial class Form1 : Form 2 { 3 System.Windows.Forms.NotifyIcon notifyIcon; 4 5 public Form1() 6 { 7 InitializeComponent(); 8 SetTaskTray(); 9 10 this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed); 11 } 12 13 public void SetTaskTray() 14 { 15 //タスクバーに表示しない 16 ShowInTaskbar = false; 17 18 //タスクトレイアイコンを初期化する 19 notifyIcon = new System.Windows.Forms.NotifyIcon(); 20 notifyIcon.Icon = this.Icon; 21 22 //タスクトレイに表示する 23 notifyIcon.Visible = true; 24 25 //アイコンにコンテキストメニュー「終了」を追加する 26 var menuStrip = new System.Windows.Forms.ContextMenuStrip(); 27 28 var exit = new System.Windows.Forms.ToolStripMenuItem(); 29 exit.Text = "終了"; 30 menuStrip.Items.Add(exit); 31 exit.Click += new System.EventHandler(OnExit); 32 33 //ContextMenuを登録する。 34 notifyIcon.ContextMenuStrip = menuStrip; 35 36 //タスクトレイアイコンにクリックイベントハンドラを登録する 37 notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(OnNotifyIconClick); 38 } 39 40 41 bool IsShown = true; 42 private void OnNotifyIconClick(object sender, System.Windows.Forms.MouseEventArgs e) 43 { 44 try 45 { 46 if (e.Button == System.Windows.Forms.MouseButtons.Left) 47 { 48 if (IsShown) 49 { 50 this.Hide(); 51 IsShown = false; 52 } 53 //ウィンドウを可視化 54 else { 55 this.Show(); 56 IsShown = true; 57 } 58 } 59 } 60 catch (Exception exception) 61 { 62 string error = exception.Message; 63 } 64 } 65 66 private void OnExit(object sender,EventArgs e) 67 { 68 this.Close(); 69 } 70 71 72 private void Form1_FormClosed(object sender, FormClosedEventArgs e) 73 { 74 MessageBox.Show("CLOSE"); 75 } 76 } 77

また、これとは別にフォーム上にTextboxを置いてみて、適当に入力した後、アイコンをクリックしてみましたが、内容は残ったままでした。

「ウインドウが閉じる」というのは何を指しているのでしょうか?

投稿2017/02/18 11:28

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2017/02/18 14:24

検証ありがとうございました。 今回扱っているソースは、自分が作ったものではなく、規模が大きくて(仕様書のドキュメントだけで100ページ以上)、ソリューションのなかのプロジェクトが約20個もあるもので、なにがどう動いているのかぜんぜん把握できずにいるのです。 普通の感覚だと、とりあえずMainのウィンドウをタスクバーに入れるには、Hide()すればよいかと思ってコードを書き足して動作をチェックしたら、いきなりClose()してしまって、途方にくれた、という感じでした。 とりあえず、Hide()でClose()するらしい、ということはわかったので、Hide()ではなく、WindowStateを使って最小化することにしました。 すこし雑談かもしれませんが、こういう大規模なプロジェクトって、どうやって理解するものですか? 基本は、すこしずつ動かして、という感じでしょうか。 まあそうやって見ているのですが、ときおり予期せぬところでメソッドが動いていて、その原因を解明するのに苦心しています。
YAmaGNZ

2017/02/18 14:43

仕様書やソースを追いかける、プロジェクトメンバーと話をするくらいしかないと思いますよ。 今回の場合ですと、該当フォーム内でHideすることによって動くイベント内でCloseしていないか、 全く他の部分からフォームが監視されていてCloseされていないか調べることになると思います。 自フォーム内であれば、調べるのは難しくないですが、他からの監視となると規模が大きいと 全体仕様の把握も難しいでしょうから、聞くしかないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問