以下のコードを使用して、バルーン通知を表示しようとしています。ブレークポイントを使用して実行されていることを確認しました。エラーも表示されません。
エラーをスローせず、バルーンを表示しないため、これをデバッグするにはどうすればよいですか?
private void showBalloon(string title, string body)
{
NotifyIcon notifyIcon = new NotifyIcon();
notifyIcon.Visible = true;
if (title != null)
{
notifyIcon.BalloonTipTitle = title;
}
if (body != null)
{
notifyIcon.BalloonTipText = body;
}
notifyIcon.ShowBalloonTip(30000);
}
タスクバーに表示するアイコンを実際には指定していません。 ShowBalloonTip
の呼び出しの前にnotifyIcon.Icon = SystemIcons.Application
を追加するだけで、LINQPadでコードを実行すると、ヒントを表示することができました。また、Dispose
インスタンスの処理が完了したら、NotifyIcon
を呼び出す必要があることに注意してください。
マシューは問題を特定しましたが、私はまだすべてのピースをまとめるのに苦労しました。したがって、LINQPadでそのまま動作する簡潔な例が役立つと考えました(おそらく他の場所でも)。 System.Windows.Forms
アセンブリを参照して、このコードを貼り付けてください。
var notification = new System.Windows.Forms.NotifyIcon()
{
Visible = true,
Icon = System.Drawing.SystemIcons.Information,
// optional - BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info,
// optional - BalloonTipTitle = "My Title",
BalloonTipText = "My long description...",
};
// Display for 5 seconds.
notification.ShowBalloonTip(5000);
// This will let the balloon close after it's 5 second timeout
// for demonstration purposes. Comment this out to see what happens
// when dispose is called while a balloon is still visible.
Thread.Sleep(10000);
// The notification should be disposed when you don't need it anymore,
// but doing so will immediately close the balloon if it's visible.
notification.Dispose();
以下のソースコードを参照してください。
using System;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
namespace ShowToolTip
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btBallonToolTip_Click(object sender, EventArgs e)
{
ShowBalloonTip();
this.Hide();
}
private void ShowBalloonTip()
{
Container bpcomponents = new Container();
ContextMenu contextMenu1 = new ContextMenu();
MenuItem runMenu = new MenuItem();
runMenu.Index = 1;
runMenu.Text = "Run...";
runMenu.Click += new EventHandler(runMenu_Click);
MenuItem breakMenu = new MenuItem();
breakMenu.Index = 2;
breakMenu.Text = "-------------";
MenuItem exitMenu = new MenuItem();
exitMenu.Index = 3;
exitMenu.Text = "E&xit";
exitMenu.Click += new EventHandler(exitMenu_Click);
// Initialize contextMenu1
contextMenu1.MenuItems.AddRange(
new System.Windows.Forms.MenuItem[] { runMenu, breakMenu, exitMenu });
// Initialize menuItem1
this.ClientSize = new System.Drawing.Size(0, 0);
this.Text = "Ballon Tootip Example";
// Create the NotifyIcon.
NotifyIcon notifyIcon = new NotifyIcon(bpcomponents);
// The Icon property sets the icon that will appear
// in the systray for this application.
string iconPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\setup-icon.ico";
notifyIcon.Icon = new Icon(iconPath);
// The ContextMenu property sets the menu that will
// appear when the systray icon is right clicked.
notifyIcon.ContextMenu = contextMenu1;
notifyIcon.Visible = true;
// The Text property sets the text that will be displayed,
// in a tooltip, when the mouse hovers over the systray icon.
notifyIcon.Text = "Morgan Tech Space BallonTip Running...";
notifyIcon.BalloonTipText = "Morgan Tech Space BallonTip Running...";
notifyIcon.BalloonTipTitle = "Morgan Tech Space";
notifyIcon.ShowBalloonTip(1000);
}
void exitMenu_Click(object sender, EventArgs e)
{
this.Close();
}
void runMenu_Click(object sender, EventArgs e)
{
MessageBox.Show("BallonTip is Running....");
}
}
}
ShowBalloonnTipはミリ秒数をとります。 3ミリ秒は、あなたにとっても速すぎるかもしれません。 3000のようなものを試してください
コンポーネントモデルをコンストラクターに渡す必要がある場合があります。それはすべての例で見られるものです。使ってから久しぶりにすみませんでした。最初の回答はこちらをご覧ください:
将来のコーダーのために:
[timeout]パラメーターはWindows Vistaで非推奨になりました
したがって、> Windows Vistaのパラメーターに0を入力するだけです。さらに悪いことに、リンクされた回答へのコメントは、これらのバルーンの置き換え、トースト通知はWindows 8でのみ導入されたことを示唆しています。どんなに長いWindowsでも、その気球をそこに残したいのです。最終的には消えてしまいますが、いくつかの経験的なテストの後、パラメーターが実際に無視されていることを確信しています。
したがって、上記の答えに基づいて、特にコメントで@jlmtによって提案されたラムダ関数を使用して、Windows 7で動作するソリューションを次に示します。
//Todo: use abstract factory pattern to detect Windows 8 and in that case use a toastnotification instead
private void DisplayNotificationBalloon(string header, string message)
{
NotifyIcon notifyIcon = new NotifyIcon
{
Visible = true,
Icon = SystemIcons.Application
};
if (header != null)
{
notifyIcon.BalloonTipTitle = header;
}
if (message != null)
{
notifyIcon.BalloonTipText = message;
}
notifyIcon.BalloonTipClosed += (sender, args) => dispose(notifyIcon);
notifyIcon.BalloonTipClicked += (sender, args) => dispose(notifyIcon);
notifyIcon.ShowBalloonTip(0);
}
private void dispose(NotifyIcon notifyIcon)
{
notifyIcon.Dispose();
}
こちらの例をご覧ください http://msdn.Microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx
あなたのコードとの間にいくつかの明確な違いがあります。ComponentModelContainer
を作成し、それをNotifyIcon
のコンストラクターに渡すなど、省略している部分がたくさんあります。