首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Win32 NotifyIcon中使用现代的Windows10上下文菜单?

在Win32 NotifyIcon中使用现代的Windows 10上下文菜单,可以通过以下步骤实现:

  1. 创建一个Win32窗口应用程序,并添加NotifyIcon到窗口中。
  2. 在窗口的消息处理函数中,处理WM_CONTEXTMENU消息,该消息在用户右键单击NotifyIcon时触发。
  3. 在WM_CONTEXTMENU消息处理函数中,创建一个现代的Windows 10上下文菜单。
  4. 使用Windows API函数来创建菜单项,并为每个菜单项添加相应的功能。
  5. 将菜单项添加到上下文菜单中。
  6. 使用Shell_NotifyIcon函数将上下文菜单与NotifyIcon关联起来。
  7. 处理菜单项的点击事件,并执行相应的操作。

下面是一个示例代码,演示如何在Win32 NotifyIcon中使用现代的Windows 10上下文菜单:

代码语言:txt
复制
#include <Windows.h>

// 上下文菜单命令ID
#define IDM_MENU_ITEM1 1001
#define IDM_MENU_ITEM2 1002
#define IDM_MENU_ITEM3 1003

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // 创建窗口
    HWND hwnd;
    WNDCLASS wc = {};

    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"WindowClass";

    RegisterClass(&wc);

    hwnd = CreateWindowEx(
        0,
        L"WindowClass",
        L"Win32 NotifyIcon",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 500, 500,
        NULL,
        NULL,
        hInstance,
        NULL
    );

    // 创建NotifyIcon
    NOTIFYICONDATA nid = {};

    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hWnd = hwnd;
    nid.uID = 1;
    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    nid.uCallbackMessage = WM_USER + 1;
    nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcscpy_s(nid.szTip, L"NotifyIcon Demo");

    Shell_NotifyIcon(NIM_ADD, &nid);

    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    // 移除NotifyIcon
    Shell_NotifyIcon(NIM_DELETE, &nid);

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CONTEXTMENU:
    {
        // 创建上下文菜单
        HMENU hMenu = CreatePopupMenu();
        AppendMenu(hMenu, MF_STRING, IDM_MENU_ITEM1, L"菜单项1");
        AppendMenu(hMenu, MF_STRING, IDM_MENU_ITEM2, L"菜单项2");
        AppendMenu(hMenu, MF_STRING, IDM_MENU_ITEM3, L"菜单项3");

        // 显示上下文菜单
        POINT pt;
        GetCursorPos(&pt);
        SetForegroundWindow(hwnd);
        TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0, hwnd, NULL);

        // 销毁上下文菜单
        DestroyMenu(hMenu);
    }
    break;

    case WM_COMMAND:
    {
        // 处理菜单项点击事件
        switch (LOWORD(wParam))
        {
        case IDM_MENU_ITEM1:
            // 执行菜单项1的操作
            MessageBox(hwnd, L"点击了菜单项1", L"提示", MB_OK);
            break;

        case IDM_MENU_ITEM2:
            // 执行菜单项2的操作
            MessageBox(hwnd, L"点击了菜单项2", L"提示", MB_OK);
            break;

        case IDM_MENU_ITEM3:
            // 执行菜单项3的操作
            MessageBox(hwnd, L"点击了菜单项3", L"提示", MB_OK);
            break;
        }
    }
    break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    return 0;
}

这个示例代码演示了如何在Win32 NotifyIcon中使用现代的Windows 10上下文菜单。在上下文菜单中,我们创建了三个菜单项,并为每个菜单项添加了点击事件处理。当用户右键单击NotifyIcon时,上下文菜单将显示,并根据用户的选择执行相应的操作。

请注意,这只是一个简单的示例,实际应用中可能需要更复杂的菜单和功能。腾讯云提供了丰富的云计算产品和服务,可以根据具体需求选择适合的产品和服务。具体的产品和服务推荐,请参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

duilib基本框架

最近我一个同学在项目中使用到了duilib框架,但是之前并没有接触过,他与我讨论这方面的内容,看着官方给出的精美的例子,我对这个库有了很大的兴趣,我自己也是初学这个东东,我在网上花了不少时间来找相关的资料,但是找到的不多,官方给的文档又不全面,但是我还是找到了一些博主贡献的优秀的博文,现在我是通过博文上的讲解加上自己查看源代码的一些心得,正在艰难的前行。现在正在看的是博主Alberl在博客园中的duilib基础教程中的内容,下面的代码都是在他博客中给出代码的基础上做了一点小小的修改。点击这里跳转到对应的博客,以及博主夜雨無聲的博客,博客地址

01

Windows程序设计学习笔记(五)——菜单资源和加速键的使用

菜单可能是Windows提供的统一用户界面中最重要的一种方式,菜单通常在标题栏的下一行显示,这一栏叫做菜单栏,菜单栏中的每一项称之为菜单项,菜单栏中的每一个菜单项在激活时会显现一个下拉菜单(也可以说是它的子菜单),下拉菜单中也可以有多个菜单项,每个菜单项又可以有子菜单,每个菜单项都有一个唯一的数字标示,称为菜单项的ID,但是有子菜单的菜单项没有ID。用户点击某项后,会产生一个WM_COMMAND消息发送到其父窗口,该消息中包含了这个菜单项的ID。菜单的创建可以通过可视化的方法创建,也可以通过编写资源脚本的方式创建菜单资源,在这里重点说明如何通过脚本编写的方式创建菜单

02

俄罗斯方块修复BUG版

//*********************************************// //**************  头文件  *********************// //*********************************************// #include <windows.h> #include <time.h> #include "stdafx.h" //*********************************************// //**************  宏定义  *********************// //*********************************************// #define WND_POS_X 10 //窗口左上角点的横坐标 #define WND_POS_Y 10 //窗口左上角点的纵坐标 #define WND_WIDTH 500 //窗口的宽度 #define WND_HEIGHT 600 //窗口的高度 #define RECT_UPPER_X 0 //背景矩形框的左上角点的横坐标 #define RECT_UPPER_Y 0 //背景矩形框的左上角点的纵坐标 #define RECT_LOWER_X 300 //背景矩形框的右下角点的横坐标 #define RECT_LOWER_Y 620 //背景矩形框的右下角点的纵坐标 #define SIDE_LEN 30 //游戏小方块的边长 #define G_ARR_ROW (RECT_LOWER_Y/SIDE_LEN) // 背景矩形框的行数 600/30=20行 #define G_ARR_RANK (RECT_LOWER_X/SIDE_LEN)// 背景矩形框的列数 300/30=10列 #define COMB_ROW 2 //随机方块的组合使用2行4列矩阵存储 #define COMB_RANK 4 #define CHANGE_SIZE 3 //3*3矩阵作为旋转矩阵 #define N_TIMER 1 //定时器的ID #define T_TIMER 500 //定时器的时间,单位为毫秒 #define IDR_MENU1                       130 #define IDR_MENU3                       133 #define IDI_ICON2                       134 #define N_TIMER                          1 //*********************************************// //**************  全局变量  *********************// //*********************************************// int g_arrBackGround[G_ARR_ROW][G_ARR_RANK] = { 0 };//背景矩阵 int g_arrRandomSquare[COMB_ROW][COMB_RANK] = { 0 };//随机块组合 int g_nIndex = 0;//随机块组合对应的序号 int G_ROW = 0;//实时记录3*3矩阵的行位置,即需要变形的矩阵位置 int G_RANK = 0;//实时记录3*3矩阵的列位置,即需要变形的矩阵位置 int gScore = 0;   //*********************************************//   //**************  函数声明 *********************//   //*********************************************//   //回调函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //消息响应函数 void OnCreate();//创建窗口时用作初始化随机数种子 void OnPaint(HDC hDC);//窗口变化时重绘函数 void OnReturn(HWND hWnd);//按键处理--回车键 void OnTimer(HWND hWnd);//定时器响应函数 void OnDown(HWND hWnd);//向下加速 void OnLeft(HWND hWnd);//左移响应函数 void OnRight(HWND hWnd);//右移响应函数 void OnU

02
领券