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

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

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

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

Q&A

解決済

2回答

1081閲覧

C# ContextMenuStrip表示時にタスクバー表示を消したいです。

urazumi

総合スコア7

C#

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

0グッド

0クリップ

投稿2018/05/08 11:34

編集2018/05/09 11:00

タスクトレイのみで常駐するWindowsFormアプリケーションです。
RContrlキーを押したらマウスポインターの位置にContextMenuStripが表示されるプログラムを作っています。その時にContextMenuStrip自身のタスクバーも表示されてしまいます。
そのタスクバー表示を非表示にする方法を教えて頂きたいです。

C# Visual Studio Community 2017 v15.7.0
.NET v4.7.03056
Windows10 Home

Program.cs

C#

1using System; 2using System.Windows.Forms; 3 4namespace MinimizeList 5{ 6 static class Program 7 { 8 public static Form1 form = new Form1(); 9 10 static void Khooked(object sender, KeyboardHookedEventArgs e) 11 { 12 if (e.UpDown == KeyboardUpDown.Down) 13 { 14 if (e.KeyCode == Keys.RControlKey) 15 { 16 OpenMenu(); 17 } 18 } 19 } 20 21 public static void OpenMenu() 22 { 23 form.contextMenuStrip1.Items.Clear(); 24 form.contextMenuStrip1.Items.Add("キャンセル"); 25 form.contextMenuStrip1.Show(Cursor.Position, ToolStripDropDownDirection.BelowRight); 26 form.contextMenuStrip1.ShowImageMargin = false; 27 28 } 29 30 [STAThread] 31 static void Main() 32 { 33 KeyboardHook Khook = new KeyboardHook(); 34 Khook.KeyboardHooked += new KeyboardHookedEventHandler(Khooked); 35 Application.Run(form); 36 } 37 } 38}

Form1.cs

C#

1using System; 2using System.ComponentModel; 3using System.Windows.Forms; 4 5namespace MinimizeList 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 private void Form1_Load(object sender, EventArgs e) 15 { 16 this.ShowInTaskbar = false; 17 this.Hide(); 18 } 19 20 private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) 21 { 22 23 } 24 25 private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) 26 { 27 28 } 29 } 30}

KeyboardHook.cs
http://hongliang.seesaa.net/article/7539988.html
こちらのサイトのKeyboardHook3.cs

試したこと

タスクトレイを左クリックした際にContextMenuStripが表示されるよう作ってみましたが、その時にもタスクバーは出てしまいました。
現象の起きる最低限のプログラムを作成しました。(ソース修正しました。)
FormにnotifyIconとcontextMenuStripを追加してHideさせてみましたが、
タスクトレイを右クリックした時にはタスクバーに表示はされませんが、
RControlキーを押してマウスポインターの位置でContextMenuStripを出すとやはりタスクバーが出てしまいました。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/05/08 11:55

何を作っているかと開発環境ぐらいは書けませんか?
urazumi

2018/05/08 11:58

最小化しているウィンドウをContextMenuStripで一覧を出して表示させるプログラムを作っています。
urazumi

2018/05/08 11:59

開発環境はWindows10 Homeです。
退会済みユーザー

退会済みユーザー

2018/05/08 12:20 編集

ContextMenuStrip という言葉から Windows Forms アプリかなぁということは想像できますが、そういうの(Windows Forms アプリだということ)は質問の一番最初の行にきちんと書きましょうよ。
退会済みユーザー

退会済みユーザー

2018/05/08 12:22 編集

> 開発環境はWindows10 Homeです ←それは OS が分かるだけ。.NET のバージョンは? Visual Studio のエディションも書いてください。
urazumi

2018/05/08 12:32

はい、すみません。Windowsフォームズアプリケーションです。.NETはバージョン4.7.03056でVisual Studio Community2017のバージョン15.7.0です。
YAmaGNZ

2018/05/08 23:36

コードを載せるのであれば、現象が確認できる最小限の動かせるソースを載せることはできませんか?
urazumi

2018/05/09 00:08 編集

コメント有難うございます。最小限に収めるのが難しかったので、全て載せました。Icon1.icoを用意しないと動かないと思います。また、任意のキーはRCtrlキーとしています。
guest

回答2

0

ベストアンサー

ちょっと試してみたところ、今回作成しているアプリケーションがフォーカスを
持っていない場合にタスクバーに表示されました。

下記コードにて、フォームにフォーカスをあてて、RCTRLキーを押した場合はタスクバーに表示されず、
フォームからフォーカスを外してRCTLキーを押した場合はタスクバーに表示されました。

C#

1using System; 2using System.Windows.Forms; 3using System.Drawing; 4 5namespace TestApp 6{ 7 static class Program 8 { 9 10 public static ContextMenuStrip rmenu = new ContextMenuStrip(); 11 public static ToolStripMenuItem rmenuItem = new ToolStripMenuItem(); 12 static Form1 f1 = new Form1(); 13 14 /// <summary> 15 /// アプリケーションのメイン エントリ ポイントです。 16 /// </summary> 17 [STAThread] 18 static void Main() 19 { 20 21 KeyboardHook Khook = new KeyboardHook(); 22 Khook.KeyboardHooked += new KeyboardHookedEventHandler(Khooked); 23 24 Application.Run(); 25 } 26 27 public static void OpenMenu() 28 { 29 //f1.Focus(); 30 rmenu.Items.Clear(); 31 rmenu.Items.Add("-"); 32 rmenu.Items.Add("キャンセル"); 33 rmenu.Show(Cursor.Position, ToolStripDropDownDirection.BelowRight); 34 rmenu.ShowImageMargin = false; 35 } 36 37 static void Khooked(object sender, KeyboardHookedEventArgs e) 38 { 39 if (e.UpDown == KeyboardUpDown.Down) 40 { 41 if (e.KeyCode == Keys.RControlKey) 42 { 43 OpenMenu(); 44 } 45 } 46 } 47 } 48 49 public class Form1 : Form 50 { 51 NotifyIcon icon = new NotifyIcon(); 52 ContextMenuStrip menu = new ContextMenuStrip(); 53 ToolStripMenuItem menuItem = new ToolStripMenuItem(); 54 55 public Form1() 56 { 57 this.ShowInTaskbar = false; 58 //this.StartPosition = FormStartPosition.Manual; 59 //this.Location = new Point(Screen.PrimaryScreen.Bounds.Right, Screen.PrimaryScreen.Bounds.Bottom); 60 this.SetComponents(); 61 this.Show(); 62 } 63 64 private void SetComponents() 65 { 66 icon.Icon = new Icon(@"ICON.ICO"); 67 icon.Visible = true; 68 icon.MouseClick += new MouseEventHandler(Mouse_Click); 69 70 menuItem.Text = "&終了"; 71 menu.Items.Add(menuItem); 72 menuItem.Click += new EventHandler(Close_Click); 73 menu.ShowImageMargin = false; 74 } 75 76 private void Close_Click(object sender, EventArgs e) 77 { 78 Application.Exit(); 79 } 80 81 private void Mouse_Click(object sender, MouseEventArgs e) 82 { 83 if (e.Button == MouseButtons.Right) 84 { 85 icon.ContextMenuStrip = menu; 86 } 87 } 88 89 } 90 91} 92

何故このようなことになるのかは、私も分かっておりません。
とりあえずの方法としてですが、上記ソースのコメント部分のように、
フォームを画面外に表示し、メニューを表示するときにフォーカスをあてるように
すると、タスクバーには表示されないようにはなりました。
ただ、この時にメニュー以外の部分をクリックしてもメニューが消えない
動きをしております。(この対処も分かりませんでした。)

多分もっとすっきりした方法があるのだと思います。

追記

C#

1 2 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 3 public static extern bool SetForegroundWindow(HandleRef hWnd); 4 5 public static void OpenMenu() 6 { 7 SetForegroundWindow(new HandleRef(rmenu, rmenu.Handle)); 8 rmenu.Items.Clear(); 9 rmenu.Items.Add("アイテム1"); 10 rmenu.Items.Add("アイテム2"); 11 rmenu.Items.Add("-"); 12 rmenu.Items.Add("キャンセル"); 13 rmenu.Show(Cursor.Position, ToolStripDropDownDirection.BelowRight); 14 rmenu.ShowImageMargin = false; 15 } 16

こうすることにより、フォームを表示し、フォーカス移動を行わなくてもタスクバーに表示されなくなりました。

投稿2018/05/09 12:37

編集2018/05/09 14:31
YAmaGNZ

総合スコア10242

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

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

urazumi

2018/05/09 13:50

回答有難うございます。貼って頂いたソースで作成し動かしてみました。 メニューを開く前にフォームにフォーカスを移す処理をすれば、常にタスクバー非表示になりますね。 ただAlt+Tabを押した時にフォームが表示されてしまうのが、ちょっと残念ですね。 この方法を使わせて頂きますが、もう少し別の回答も待ってみます。すみません。
YAmaGNZ

2018/05/09 14:14

ALT+TABに関しては this.FormBorderStyle = FormBorderStyle.FixedToolWindow; とすると表示されなくはなります。
urazumi

2018/05/09 14:27

有難うございます!
urazumi

2018/05/09 14:48

有難うございます!完璧ですね!ベストアンサーにさせて頂きます。
guest

0

こっちでFormにContextMenuStripとNotifyIcon貼り付けて、タスクトレイにアイコンを表示後、FormをHideさせてますが、タスクバーに出ることはないですね

最小のサンプルを作って確認してみてはどうでしょうか

投稿2018/05/08 22:06

y_waiwai

総合スコア87749

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

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

urazumi

2018/05/08 23:12

回答有難うございます。Formに配置したContextMenuStripをプログラムから呼ぶ方法が分かりません。。。プログラム上でnewしたContextMenuStripを使うことはできるのですが。。
y_waiwai

2018/05/09 09:26

「C# ContextMenuStrip」でぐぐれば解説がたくさん出てきます FormにContextMenuStripとNotifyIcon貼り付けて、貼り付けたContextMenuStripをダブルクリックすれば、メニューの作成ができます。 NotifyIcon(や、Form)のContextMenuStripプロパティに、貼り付けたContextMenuStripを設定、そうすればなにもしなくても右クリックでメニューが出ます
urazumi

2018/05/09 11:09

y_waiwaiさんの方法で作ってみました。タスクトレイを右クリックした時は、タスクバー表示されませんが、RControlキーを押してマウスポインターの位置にContextMenuStripを表示すると、タスクバーに表示されてしまいますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問