情報アイランド

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

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

step1:ウィンドウの表示

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

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

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

step5:タスクトレイアイコンにフライアウトウィンドウを追加する(その1)

step6:タスクトレイアイコンにフライアウトウィンドウを追加する(その2)

今回でタスクトレイアイコン周りについては終わりにする予定です。今回はタスクトレイアイコンにカスタムのツールチップを表示してみます。

前々回と前回のフライアウトウィンドウを流用し、タスクトレイアイコンの上にマウスポインタが移動した時、通常のツールチップではなくフライアウトウィンドウが表示されるようにします。

また、タスクトレイアイコンが左クリックされた場合は、前回の動作の代わりにメインウィンドウをアクティブにするよう変更します。

最初に、WndProcWM_CREATEを受け取った場合の処理を以下のように変更します。太字で示した行が変更箇所です。

前回までNIF_SHOWTIPフラグを指定して普通のツールチップが表示されるようにしていましたが、今回はカスタムのツールチップを表示するためこのフラグの指定を削除します。

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;
        notifyicondata.uCallbackMessage = WIN32.Window.WM_APP;
        notifyicondata.hIcon = hicon;
        notifyicondata.szTip = "∀In++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;
    }

次に、WndProcWM_APPを受け取った場合の処理を以下のように変更します。

NIN_SELECTの場合にウィンドウを前面に表示するように変更し、NIN_POPUPOPENとNIN_POPUPCLOSEの場合の処理を追加します。

case WIN32.Window.WM_APP:
    switch ((uint)WIN32.Common.LOWORD(lParam))
    {
      (省略)

        case WIN32.NotifyIcon.NIN_SELECT:
            WIN32.Window.SetForegroundWindow(hWnd);

            break;

      (省略)

        case WIN32.NotifyIcon.NIN_POPUPOPEN:
            WIN32.Window.RECT rectWindow = new WIN32.Window.RECT();
            rectWindow.left = 0;
            rectWindow.top = 0;
            rectWindow.right = 256;
            rectWindow.bottom = 256;
            WIN32.Window.AdjustWindowRectEx(ref rectWindow, WIN32.Window.WS.WS_POPUP | WIN32.Window.WS.WS_THICKFRAME, false, WIN32.Window.WS_EX.WS_EX_TOOLWINDOW);

            WIN32.Window.RECT rectNotifyIcon = new WIN32.Window.RECT();
            WIN32.NotifyIcon.NOTIFYICONIDENTIFIER notifyiconidentifier = new WIN32.NotifyIcon.NOTIFYICONIDENTIFIER();
            notifyiconidentifier.cbSize = (uint)Marshal.SizeOf(notifyiconidentifier);
            notifyiconidentifier.hWnd = hWnd;
            notifyiconidentifier.uID = 0;
            WIN32.NotifyIcon.Shell_NotifyIconGetRect(ref notifyiconidentifier, out rectNotifyIcon);

            WIN32.Window.POINT point = new WIN32.Window.POINT();
            point.x = (rectNotifyIcon.left + rectNotifyIcon.right) / 2;
            point.y = (rectNotifyIcon.top + rectNotifyIcon.bottom) / 2;

            WIN32.Window.SIZE size = new WIN32.Window.SIZE();
            size.cx = rectWindow.right - rectWindow.left;
            size.cy = rectWindow.bottom - rectWindow.top;

            WIN32.Window.CalculatePopupWindowPosition(ref point, ref size, WIN32.Menu.TPM.TPM_CENTERALIGN | WIN32.Menu.TPM.TPM_VCENTERALIGN | WIN32.Menu.TPM.TPM_VERTICAL | WIN32.Menu.TPM.TPM_WORKAREA, ref rectNotifyIcon, out rectWindow);

            IntPtr hFlyoutWnd = hflyoutwnd = WIN32.Window.CreateWindowEx(WIN32.Window.WS_EX.WS_EX_TOOLWINDOW, "anttnFlyout", null, WIN32.Window.WS.WS_POPUP | WIN32.Window.WS.WS_THICKFRAME, rectWindow.left, rectWindow.top, rectWindow.right - rectWindow.left, rectWindow.bottom - rectWindow.top, IntPtr.Zero, IntPtr.Zero, hinstance, IntPtr.Zero);

            WIN32.Window.ShowWindow(hFlyoutWnd, WIN32.Window.SW.SW_SHOW);
            WIN32.Window.UpdateWindow(hFlyoutWnd);
            WIN32.Window.SetForegroundWindow(hFlyoutWnd);

            break;
        case WIN32.NotifyIcon.NIN_POPUPCLOSE:
            WIN32.Window.DestroyWindow(hflyoutwnd);

            break;
    }

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

using System;
using System.Runtime.InteropServices;

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

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

-C#, WIN32API