Windows Forms アプリケーションをシステムトレイで実行するには、何をする必要がありますか?
トレイに最小化できるアプリケーションではなく、アイコン、ツールヒント、および「右クリック」メニュー以外は何も持たない、トレイにのみ存在するアプリケーションです。
NotifyIconを使用する基本的な答えは正しいですが、.NETの多くのことと同様に、それを行うには微妙な点がたくさんありますright。 Bradが言及したチュートリアルでは、非常に基本的な手順を詳しく説明していますが、これらのいずれにも対処していません。
Simple-Talk.comで公開された記事で、これらのポイントを詳細に取り上げ、すぐに使用できるトレイアプリケーションフレームワークと、実際のすべてを表示する完全な実世界のサンプルアプリケーションを提供しました。 。NETでのトレイアプリケーションの作成:実践ガイド 、2010年11月公開を参照してください。
コードプロジェクトの記事 Creating a Tasktray Application は、システムトレイにしか存在しないアプリケーションを作成する非常に簡単な説明と例を示しています。
基本的にProgram.cs
のApplication.Run(new Form1());
行を変更して、代わりにApplicationContext
を継承するクラスを起動し、そのクラスのコンストラクターがNotifyIcon
を初期化するようにします
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyCustomApplicationContext());
}
}
public class MyCustomApplicationContext : ApplicationContext
{
private NotifyIcon trayIcon;
public MyCustomApplicationContext ()
{
// Initialize Tray Icon
trayIcon = new NotifyIcon()
{
Icon = Resources.AppIcon,
ContextMenu = new ContextMenu(new MenuItem[] {
new MenuItem("Exit", Exit)
}),
Visible = true
};
}
void Exit(object sender, EventArgs e)
{
// Hide tray icon, otherwise it will remain shown until user mouses over it
trayIcon.Visible = false;
Application.Exit();
}
}
Mat1tが言うように-NotifyIconをアプリケーションに追加し、次のコードのようなものを使用してツールチップとコンテキストメニューを設定する必要があります。
this.notifyIcon.Text = "This is the tooltip";
this.notifyIcon.ContextMenu = new ContextMenu();
this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method)));
このコードは、システムトレイにのみアイコンを表示します。
this.notifyIcon.Visible = true; // Shows the notify icon in the system tray
(何らかの理由で)フォームがある場合、次のものが必要になります。
this.ShowInTaskbar = false; // Removes the application from the taskbar
Hide();
コンテキストメニューを取得するための右クリックは自動的に処理されますが、左クリックで何らかのアクションを実行する場合は、クリックハンドラーを追加する必要があります。
private void notifyIcon_Click(object sender, EventArgs e)
{
var eventArgs = e as MouseEventArgs;
switch (eventArgs.Button)
{
// Left click to reactivate
case MouseButtons.Left:
// Do your stuff
break;
}
}
.NET 1.1でトレイバーアプリを作成しましたが、フォームは必要ありませんでした。
まず、プロジェクトのスタートアップオブジェクトをモジュールで定義されたSub Main
として設定します。
その後、プログラムでコンポーネントNotifyIcon
およびContextMenu
を作成します。
必ずMenuItem
「Quit」などを含めてください。ContextMenu
をNotifyIcon
にバインドします。Application.Run()
を呼び出します。
Quit MenuItem
のイベントハンドラーで、必ずset NotifyIcon.Visible = False
を呼び出してから、Application.Exit()
を呼び出してください。必要なものをContextMenu
に追加し、適切に処理します:)
Form1
を削除します。Form1
を起動するProgram.csのコードを削除します。NotifyIcon
クラスを使用して、システムトレイアイコンを作成します(アイコンを割り当てます)。NotifyIcon
のマウスクリックに反応して、右クリックと左クリックを区別し、コンテキストメニューを設定して、どのボタン(右/左)が押されたかを表示します。Application.Run()
を使用してアプリを実行し続けると、Application.Exit()
で終了します。またはwhile(bRunning){Application.DoEvents;Thread.Sleep(10);}
。次に、bRunning = false
を設定してアプリを終了します。「システムトレイ」アプリケーションは、通常のwinフォームアプリケーションです。唯一の違いは、Windowsシステムトレイ領域にアイコンを作成することです。 sys.trayアイコンを作成するには、NotifyIconコンポーネントを使用して、ツールボックス(共通コントロール)で見つけて、そのプロパティ(アイコン、ツールヒント)を変更します。また、マウスクリックとダブルクリックのメッセージを処理できます。
そしてもう1つ、ルックアンドフィールまたは標準のトレイアプリを実現するためです。メインフォームのshowイベントにfollowinf行を追加します。
private void MainForm_Shown(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
Hide();
}
私が知る限り、フォームを使用してアプリケーションを作成する必要がありますが、フォーム上にコントロールがなく、表示されることはありません。 NotifyIcon(MSDNサンプルの here )を使用して、アプリケーションを記述します。
これが Visual Studio 201 、.NET 4
これは、通知領域アプリケーションにとって非常に使いやすいフレームワークです... NotificationIconを基本フォームに追加し、自動生成されたコードを以下のコードに変更するだけで十分です。
public partial class Form1 : Form
{
private bool hidden = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.ShowInTaskbar = false;
//this.WindowState = FormWindowState.Minimized;
this.Hide();
hidden = true;
}
private void notifyIcon1_Click(object sender, EventArgs e)
{
if (hidden) // this.WindowState == FormWindowState.Minimized)
{
// this.WindowState = FormWindowState.Normal;
this.Show();
hidden = false;
}
else
{
// this.WindowState = FormWindowState.Minimized;
this.Hide();
hidden = true;
}
}
}
単に追加する
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
フォームオブジェクトに。システムトレイにはアイコンのみが表示されます。