Jump to content

Recommended Posts

Posted
#include <windows.h>
#include <shellapi.h>

#define WM_TRAYICON (WM_USER + 1)
#define ID_TRAY_APP_ICON 1001
#define ID_MENU_EXIT 101
#define ID_MENU_OPTION1 102
#define ID_MENU_OPTION2 103

// Global variables
NOTIFYICONDATA nid;
HMENU hPopupMenu;

// Forward declarations
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI main(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    // Register window class
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"TrayAppClass";
    RegisterClass(&wc);

    // Create window (hidden)
    HWND hwnd = CreateWindow(wc.lpszClassName, L"TrayApp", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 300, 200,
        NULL, NULL, hInstance, NULL);

    // Initialize NOTIFYICONDATA
    ZeroMemory(&nid, sizeof(nid));
    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hWnd = hwnd;
    nid.uID = ID_TRAY_APP_ICON;
    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    nid.uCallbackMessage = WM_TRAYICON;

    // Load icon
    HICON hIcon = LoadIcon(NULL, IDI_APPLICATION);
    nid.hIcon = hIcon;

    // Set tooltip
    lstrcpy(nid.szTip, L"My Tray Icon");

    // Add icon to system tray
    Shell_NotifyIcon(NIM_ADD, &nid);

    // Create popup menu
    hPopupMenu = CreatePopupMenu();
    AppendMenu(hPopupMenu, MF_STRING, ID_MENU_OPTION1, L"Option 1");
    AppendMenu(hPopupMenu, MF_STRING, ID_MENU_OPTION2, L"Option 2");
    AppendMenu(hPopupMenu, MF_SEPARATOR, 0, NULL);
    AppendMenu(hPopupMenu, MF_STRING, ID_MENU_EXIT, L"Exit");

    // Message loop
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    // Cleanup
    Shell_NotifyIcon(NIM_DELETE, &nid);
    DestroyIcon(hIcon);
    DestroyMenu(hPopupMenu);
    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_TRAYICON:
    {
        if (lParam == WM_LBUTTONUP)
        {
            // Left click - optional: show message or do something
        }
        else if (lParam == WM_RBUTTONUP)
        {
            // Right click - show context menu
            POINT pt;
            GetCursorPos(&pt);
            SetForegroundWindow(hwnd); // Needed for menu to work properly
            TrackPopupMenu(hPopupMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL);
        }
        break;
    }
    case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {
        case ID_MENU_OPTION1:
            MessageBox(NULL, L"Option 1 selected", L"Info", MB_OK);
            break;
        case ID_MENU_OPTION2:
            MessageBox(NULL, L"Option 2 selected", L"Info", MB_OK);
            break;
        case ID_MENU_EXIT:
            PostMessage(hwnd, WM_CLOSE, 0, 0);
            break;
        }
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

 

My job is to make tools you love, with the features you want, and performance you can't live without.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...