web-dev-qa-db-ja.com

バルーン通知を表示する

以下のコードを使用して、バルーン通知を表示しようとしています。ブレークポイントを使用して実行されていることを確認しました。エラーも表示されません。

エラーをスローせず、バルーンを表示しないため、これをデバッグするにはどうすればよいですか?

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);
}
37
Ben

タスクバーに表示するアイコンを実際には指定していません。 ShowBalloonTipの呼び出しの前にnotifyIcon.Icon = SystemIcons.Applicationを追加するだけで、LINQPadでコードを実行すると、ヒントを表示することができました。また、Disposeインスタンスの処理が完了したら、NotifyIconを呼び出す必要があることに注意してください。

46

マシューは問題を特定しましたが、私はまだすべてのピースをまとめるのに苦労しました。したがって、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();
26
Jeremy Cook

以下のソースコードを参照してください。

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....");
        }
    }
}
2
kombsh

ShowBalloonnTipはミリ秒数をとります。 3ミリ秒は、あなたにとっても速すぎるかもしれません。 3000のようなものを試してください

コンポーネントモデルをコンストラクターに渡す必要がある場合があります。それはすべての例で見られるものです。使ってから久しぶりにすみませんでした。最初の回答はこちらをご覧ください:

NotifyIconが表示されない

1
AaronLS

将来のコーダーのために:

[timeout]パラメーターはWindows Vistaで非推奨になりました

参照: C#NotifyIconバルーンパラメータの非推奨

したがって、> 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();
        }

ノート

  • 私はそこにTODOを入れて、Windows 8の別の実装を作成しました。現在、Windows 7/8では50/50であるため、新しい機能をサポートするのが良いでしょう。複数のバージョンのWindows用にこれをコーディングしている他の誰かが、おそらく同じことを行うのが理想的です。または、7のサポートを停止して、ToastNotificationの使用に切り替えます。
  • ブレークポイントが実際にヒットしたことをデバッグおよび検証できるように、意図的に関数内で処理を定義しました。
0
Colm Bhandal

こちらの例をご覧ください http://msdn.Microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

あなたのコードとの間にいくつかの明確な違いがあります。ComponentModelContainerを作成し、それをNotifyIconのコンストラクターに渡すなど、省略している部分がたくさんあります。

0
evanmcdonnal