情報アイランド

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

C#でWIN32API step2 タスクトレイアイコンを表示する

2017/07/19

step1:ウィンドウの表示

順番がおかしい気がしますが、Hello Worldを表示する前にタスクトレイアイコンを使ってみます。起動と同時にタスクトレイにアイコンを追加し、終了時に削除します。

前回のプログラムからWndProcを以下のように変更するだけです。

タスクトレイアイコンの使用で最も重要なのはNOTIFYICONDATA構造体とShell_NotufyIcon関数です。NOTIFYICONDATA構造体を適切に設定した後、適切なフラグと共にNOTIFYICONDATA構造体をShell_NotifyIcon関数に渡します。

Windows 7ではGUIDを使う方法が推奨されていますが、このプログラムではVista以前の方法を使っています。

private static IntPtr WndProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
{
    switch (uMsg)
    {
        case WIN32.Window.WM_CREATE:
            {
                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_MESSAGE | WIN32.NotifyIcon.NIF.NIF_ICON | WIN32.NotifyIcon.NIF.NIF_TIP | WIN32.NotifyIcon.NIF.NIF_SHOWTIP;
                notifyicondata.uCallbackMessage = WIN32.Window.WM_APP;
                notifyicondata.hIcon = hicon;
                notifyicondata.szTip = "∀n++n 0.0.0.0";

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

                notifyicondata.uVersion = WIN32.NotifyIcon.NOTIFYICON_VERSION_4;

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

                break;
            }
        case WIN32.Window.WM_DESTROY:
            {
                WIN32.NotifyIcon.NOTIFYICONDATA notifyicondata = new WIN32.NotifyIcon.NOTIFYICONDATA();
                notifyicondata.cbSize = (uint)Marshal.SizeOf(notifyicondata);
                notifyicondata.hWnd = hWnd;
                notifyicondata.uID = 0;

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

                WIN32.Window.PostQuitMessage(0);

                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 Window
    {
    (省略)

        public const uint WM_CREATE = 0x0001;

    (省略)
    }
}
using System;
using System.Runtime.InteropServices;

namespace Anttn.WIN32
{
    public static partial class NotifyIcon
    {
        [DllImport("shell32.dll")]
        public static extern bool Shell_NotifyIcon(NIM dwMessage, [In] ref NOTIFYICONDATA lpdata);

        [StructLayout(LayoutKind.Sequential)]
        public struct NOTIFYICONDATA
        {
            public uint cbSize;
            public IntPtr hWnd;
            public uint uID;
            public NIF uFlags;
            public uint uCallbackMessage;
            public IntPtr hIcon;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string szTip;
            public NIS dwState;
            public NIS dwStateMask;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string szInfo;
            public uint uVersion;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
            public string szInfoTitle;
            public NIIF dwInfoFlags;
            public Guid guidItem;
            public IntPtr hBalloonIcon;
        }

        [Flags]
        public enum NIF : uint
        {
            NIF_MESSAGE = 0x00000001,
            NIF_ICON = 0x00000002,
            NIF_TIP = 0x00000004,
            NIF_STATE = 0x00000008,
            NIF_INFO = 0x00000010,
            NIF_GUID = 0x00000020,
            NIF_REALTIME = 0x00000040,
            NIF_SHOWTIP = 0x00000080,
        }

        [Flags]
        public enum NIS : uint
        {
            NIS_HIDDEN = 0x00000001,
            NIS_SHAREDICON = 0x00000002,
        }

        [Flags]
        public enum NIIF : uint
        {
            NIIF_NONE = 0x00000000,
            NIIF_INFO = 0x00000001,
            NIIF_WARNING = 0x00000002,
            NIIF_ERROR = 0x00000003,
            NIIF_USER = 0x00000004,
            NIIF_NOSOUND = 0x00000010,
            NIIF_LARGE_ICON = 0x00000020,
            NIIF_RESPECT_QUIET_TIME = 0x00000080,
            NIIF_ICON_MASK = 0x0000000F,
        }

        public enum NIM : uint
        {
            NIM_ADD = 0x00000000,
            NIM_MODIFY = 0x00000001,
            NIM_DELETE = 0x00000002,
            NIM_SETFOCUS = 0x00000003,
            NIM_SETVERSION = 0x00000004,
        }

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

-C#, WIN32API