情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

C#でWIN32API step4 タスクトレイアイコンにバルーンチップを表示する

step1:ウィンドウの表示

step2:タスクトレイアイコンを表示する

step3:タスクトレイアイコンにコンテキストメニューを追加する

引き続き前回のプログラムを改良して、タスクトレイアイコンにバルーンチップを表示するようにします。

タスクトレイアイコンのコンテキストメニューに「バルーンチップを表示する」という項目を追加し、この項目が選択された時にバルーンチップを表示するようにしました。

また、バルーンチップが左クリックされた時にメッセージボックスを表示します。

バルーンチップの表示で使用するのはNOTIFYICONDATA構造体のszInfoszInfoTitledwInfoFlagsです。

また、バルーンチップの消滅時にNIN_BALLOONTIMEOUT、左クリック時にNIN_BALLOONUSERCLICKlParamの下位に格納された専用メッセージ(下のプログラムの場合はWM_APP)が飛んできます。

前回のプログラムのWndProcのWM_COMMANDWM_APPを受け取った場合の処理を以下のように変更します(前回と同じ部分は省略しました)。

private static IntPtr WndProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
{
    switch (uMsg)
    {
    (省略)

        case WIN32.Window.WM_COMMAND:
            switch ((uint)WIN32.Common.LOWORD(wParam))
            {
                case 0:
                    WIN32.NotifyIcon.NOTIFYICONDATA notifyicondata = new WIN32.NotifyIcon.NOTIFYICONDATA();
                    notifyicondata.cbSize = (uint)Marshal.SizeOf(notifyicondata);
                    notifyicondata.hWnd = hWnd;
                    notifyicondata.uID = 0;
                    notifyicondata.uFlags = WIN32.NotifyIcon.NIF.NIF_INFO;
                    notifyicondata.szInfo = "バルーンチップを表示しています。";
                    notifyicondata.szInfoTitle = "バルーンチップを表示する";
                    notifyicondata.dwInfoFlags = WIN32.NotifyIcon.NIIF.NIIF_INFO;

                    WIN32.NotifyIcon.Shell_NotifyIcon(WIN32.NotifyIcon.NIM.NIM_MODIFY, ref notifyicondata);

                    break;
                case 1:
                    WIN32.Window.DestroyWindow(hWnd);
                    break;
            }
            break;
        case WIN32.Window.WM_APP:
            switch ((uint)WIN32.Common.LOWORD(lParam))
            {
                case WIN32.Window.WM_CONTEXTMENU:
                    IntPtr hMenu = WIN32.Menu.CreatePopupMenu();

                    WIN32.Menu.MENUITEMINFO menuiteminfo = new WIN32.Menu.MENUITEMINFO();
                    menuiteminfo.cbSize = (uint)Marshal.SizeOf(menuiteminfo);
                    menuiteminfo.fMask = WIN32.Menu.MIIM.MIIM_STRING | WIN32.Menu.MIIM.MIIM_ID;
                    menuiteminfo.wID = 0;
                    menuiteminfo.dwTypeData = "バルーンチップを表示する";
                    menuiteminfo.cch = (uint)menuiteminfo.dwTypeData.Length;

                    WIN32.Menu.InsertMenuItem(hMenu, 0, true, ref menuiteminfo);

                    menuiteminfo.fMask = WIN32.Menu.MIIM.MIIM_FTYPE;
                    menuiteminfo.fType = WIN32.Menu.MFT.MFT_SEPARATOR;

                    WIN32.Menu.InsertMenuItem(hMenu, 1, true, ref menuiteminfo);

                    menuiteminfo.fMask = WIN32.Menu.MIIM.MIIM_STRING | WIN32.Menu.MIIM.MIIM_ID;
                    menuiteminfo.wID = 1;
                    menuiteminfo.dwTypeData = "終了";
                    menuiteminfo.cch = (uint)menuiteminfo.dwTypeData.Length;

                    WIN32.Menu.InsertMenuItem(hMenu, 2, true, ref menuiteminfo);

                    WIN32.Menu.TrackPopupMenuEx(hMenu, WIN32.Menu.TPM.TPM_LEFTALIGN, WIN32.Common.LOWORD(wParam), WIN32.Common.HIWORD(wParam), hWnd, IntPtr.Zero);
                    WIN32.Menu.DestroyMenu(hMenu);

                    break;
                case WIN32.NotifyIcon.NIN_BALLOONTIMEOUT:
                    {
                        WIN32.NotifyIcon.NOTIFYICONDATA notifyicondata = new WIN32.NotifyIcon.NOTIFYICONDATA();
                        notifyicondata.cbSize = (uint)Marshal.SizeOf(notifyicondata);
                        notifyicondata.hWnd = hWnd;
                        notifyicondata.uID = 0;
                        notifyicondata.uFlags = WIN32.NotifyIcon.NIF.NIF_SHOWTIP;

                        WIN32.NotifyIcon.Shell_NotifyIcon(WIN32.NotifyIcon.NIM.NIM_MODIFY, ref notifyicondata);

                        break;
                    }
                case WIN32.NotifyIcon.NIN_BALLOONUSERCLICK:
                    {
                        WIN32.NotifyIcon.NOTIFYICONDATA notifyicondata = new WIN32.NotifyIcon.NOTIFYICONDATA();
                        notifyicondata.cbSize = (uint)Marshal.SizeOf(notifyicondata);
                        notifyicondata.hWnd = hWnd;
                        notifyicondata.uID = 0;
                        notifyicondata.uFlags = WIN32.NotifyIcon.NIF.NIF_SHOWTIP;

                        WIN32.NotifyIcon.Shell_NotifyIcon(WIN32.NotifyIcon.NIM.NIM_MODIFY, ref notifyicondata);

                        WIN32.DialogBox.MessageBox(hWnd, "バルーンチップがクリックされました。", "∀n++n", WIN32.DialogBox.MessageBoxOptions.Ok | WIN32.DialogBox.MessageBoxOptions.IconInformation);

                        break;
                    }
            }
            break;
        default:
            return WIN32.Window.DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return IntPtr.Zero;
}

こちらが、P/I用のコードです(前回からの追加部分)。

using System;
using System.Runtime.InteropServices;

namespace Anttn.WIN32
{
    public static partial class DialogBox
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern MessageBoxResult MessageBox(IntPtr hWnd, string text, string caption, MessageBoxOptions options);

        [Flags]
        public enum MessageBoxOptions : uint
        {
            Ok = 0x000000,
            OkCancel = 0x000001,
            AbortRetryIgnore = 0x000002,
            YesNoCancel = 0x000003,
            YesNo = 0x000004,
            RetryCancel = 0x000005,
            CancelTryContinue = 0x000006,

            IconHand = 0x000010,
            IconQuestion = 0x000020,
            IconExclamation = 0x000030,
            IconAsterisk = 0x000040,
            UserIcon = 0x000080,

            IconWarning = IconExclamation,
            IconError = IconHand,
            IconInformation = IconAsterisk,
            IconStop = IconHand,

            DefButton1 = 0x000000,
            DefButton2 = 0x000100,
            DefButton3 = 0x000200,
            DefButton4 = 0x000300,

            ApplicationModal = 0x000000,
            SystemModal = 0x001000,
            TaskModal = 0x002000,

            Help = 0x004000,
            NoFocus = 0x008000,

            SetForeground = 0x010000,
            DefaultDesktopOnly = 0x020000,
            Topmost = 0x040000,
            Right = 0x080000,
            RTLReading = 0x100000,
        }

        public enum MessageBoxResult : uint
        {
            Ok = 1,
            Cancel,
            Abort,
            Retry,
            Ignore,
            Yes,
            No,
            Close,
            Help,
            TryAgain,
            Continue,
            Timeout = 32000
        }
    }
}
using System;
using System.Runtime.InteropServices;

namespace Anttn.WIN32
{
    public static partial class NotifyIcon
    {
    (省略)

        public const uint NIN_BALLOONTIMEOUT = 0x0404;
        public const uint NIN_BALLOONUSERCLICK = 0x0405;
    }
}
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-C#, WIN32API