无忧资源站

 找回密码
 加入我们
查看: 832|回复: 0

[C/C++] C++实现windows任务栏小图标

[复制链接]

18

主题

22

帖子

174

积分

学徒

Rank: 2

积分
174

最佳新人

发表于 2023-10-26 10:53:37 | 显示全部楼层 |阅读模式
  1. // 回调函数,处理通知消息
  2. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  3. {
  4.         switch (msg)
  5.         {
  6.         case WM_CREATE:
  7.         {
  8.                 // 创建托盘图标
  9.                 NOTIFYICONDATAA nid;
  10.                 nid.cbSize = sizeof(NOTIFYICONDATAA);
  11.                 nid.hWnd = hwnd;
  12.                 nid.uID = 1;
  13.                 nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
  14.                 nid.uCallbackMessage = WM_USER + 1;
  15.                 nid.hIcon = LoadIcon(NULL, IDI_INFORMATION);
  16.                 strcpy(nid.szTip, "Notification");
  17.                 Shell_NotifyIconA(NIM_ADD, &nid);

  18.                 // 设置托盘图标的上下文菜单
  19.                 HMENU hMenu = CreatePopupMenu();
  20.                 AppendMenuA(hMenu, MF_STRING, 1, "Show Notification");
  21.                 AppendMenuA(hMenu, MF_STRING, 2, "Exit");
  22.                 SetMenuDefaultItem(hMenu, 1, FALSE);
  23.                 SetForegroundWindow(hwnd);
  24.                 TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, 0, 0, 0, hwnd, NULL);
  25.                 DestroyMenu(hMenu);
  26.                 break;
  27.         }
  28.         case WM_USER + 1:
  29.         {
  30.                 // 处理托盘图标的消息
  31.                 switch (lParam)
  32.                 {
  33.                 case WM_LBUTTONUP:
  34.                         MessageBoxA(NULL, "This is a notification message.", "Notification", MB_ICONINFORMATION);
  35.                         break;
  36.                 case WM_RBUTTONUP:
  37.                 {
  38.                         HMENU hMenu = CreatePopupMenu();
  39.                         AppendMenuA(hMenu, MF_STRING, 1, "Show Notification");
  40.                         AppendMenuA(hMenu, MF_STRING, 2, "Exit");
  41.                         SetMenuDefaultItem(hMenu, 1, FALSE);
  42.                         POINT pt;
  43.                         GetCursorPos(&pt);
  44.                         SetForegroundWindow(hwnd);
  45.                         TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL);
  46.                         DestroyMenu(hMenu);
  47.                         break;
  48.                 }
  49.                 }
  50.                 break;
  51.         }
  52.         case WM_COMMAND:
  53.                 // 处理菜单项的点击事件
  54.                 switch (LOWORD(wParam))
  55.                 {
  56.                 case 1:
  57.                         MessageBoxA(NULL, "This is a notification message.", "Notification", MB_ICONINFORMATION);
  58.                         break;
  59.                 case 2:
  60.                         DestroyWindow(hwnd);
  61.                         break;
  62.                 }
  63.                 break;
  64.         case WM_DESTROY:
  65.                 // 移除托盘图标
  66.                 NOTIFYICONDATA nid;
  67.                 nid.cbSize = sizeof(NOTIFYICONDATA);
  68.                 nid.hWnd = hwnd;
  69.                 nid.uID = 1;
  70.                 Shell_NotifyIcon(NIM_DELETE, &nid);
  71.                 PostQuitMessage(0);
  72.                 break;
  73.         default:
  74.                 return DefWindowProc(hwnd, msg, wParam, lParam);
  75.         }
  76.         return 0;
  77. }

  78. int  main()
  79. {
  80.         HINSTANCE hInstance = 0;
  81.         // 注册窗口类
  82.         WNDCLASSEXA wcex;
  83.         wcex.cbSize = sizeof(WNDCLASSEXA);
  84.         wcex.style = CS_HREDRAW | CS_VREDRAW;
  85.         wcex.lpfnWndProc = WndProc;
  86.         wcex.cbClsExtra = 0;
  87.         wcex.cbWndExtra = 0;
  88.         wcex.hInstance = hInstance;
  89.         wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  90.         wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  91.         wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  92.         wcex.lpszMenuName = NULL;
  93.         wcex.lpszClassName = "MyWindowClass";
  94.         wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  95.         RegisterClassExA(&wcex);

  96.         // 创建窗口
  97.         HWND hwnd = CreateWindowA("MyWindowClass", "Notification Demo", WS_OVERLAPPEDWINDOW,
  98.                 CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL);
  99.         if (!hwnd)
  100.                 return 0;

  101.         // 显示窗口
  102.         ShowWindow(hwnd, SW_SHOW);
  103.         UpdateWindow(hwnd);

  104.         // 消息循环
  105.         MSG msg;
  106.         while (GetMessage(&msg, NULL, 0, 0))
  107.         {
  108.                 TranslateMessage(&msg);
  109.                 DispatchMessage(&msg);
  110.         }

  111.         return (int)msg.wParam;
  112. }
复制代码


QQ|SiteMap|Map|小黑屋|无忧资源站

GMT+8, 2024-5-19 17:57 , Processed in 0.053213 second(s), 20 queries .

无忧资源站

Copyright © 2022-2032 www.wyzyz.net

快速回复 返回顶部 返回列表