鱼C论坛

 找回密码
 立即注册
查看: 1678|回复: 14

[已解决]怎么编写系统托盘系统自定义消息呢!!简单做个提示框也好。-_-

[复制链接]
发表于 2021-11-8 22:52:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
c语言怎么编写出QQ 微信 这些应用软件那样 在系统托盘任务栏有自己的图标还可以信息提示呢。 刚好最近初学学API调用 查到有这么个函数   <windows.h>  Shell_NotifyIcon 可以实现!奈何本人才疏学浅 目前还没有实现  哪位仁兄可以指点一二.
最佳答案
2021-11-9 20:31:39
本帖最后由 人造人 于 2021-11-9 20:33 编辑
  1. #include <windows.h>
  2. #include <wchar.h>
  3. #include <strsafe.h>

  4. #define WM_NOTIFYICON (WM_USER + 1)

  5. HMENU hmenuRoot = NULL;
  6. NOTIFYICONDATA nid;
  7. const TCHAR szAppName[] = TEXT("MyWindows");

  8. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
  9.     HDC hdc;
  10.     PAINTSTRUCT ps;
  11.     RECT rect;
  12.     POINT point;
  13.     switch(message) {
  14.         case WM_CREATE:
  15.             hmenuRoot = CreateMenu();
  16.             HMENU hmenuPopup = CreatePopupMenu();
  17.             AppendMenu(hmenuPopup, MF_STRING, 1, TEXT("A"));
  18.             AppendMenu(hmenuPopup, MF_STRING, 2, TEXT("B"));
  19.             AppendMenu(hmenuPopup, MF_STRING, 3, TEXT("C"));
  20.             AppendMenu(hmenuRoot, MF_POPUP, (UINT_PTR)hmenuPopup, TEXT("MA"));
  21.             SetMenu(hwnd, hmenuRoot);
  22.             return 0;
  23.         case WM_COMMAND:
  24.             switch(LOWORD(wParam)) {
  25.                 case 1:
  26.                     if(nid.cbSize == sizeof(nid)) {
  27.                         DestroyIcon(nid.hIcon);
  28.                     }
  29.                     ZeroMemory(&nid, sizeof(nid));
  30.                     nid.cbSize = sizeof(nid);
  31.                     nid.hWnd = hwnd;
  32.                     nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
  33.                     nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  34.                     StringCchCopy(nid.szTip, sizeof(nid.szTip), szAppName);
  35.                     nid.uCallbackMessage = WM_NOTIFYICON;
  36.                     Shell_NotifyIcon(NIM_ADD, &nid);
  37.                     return 0;
  38.                 case 2:
  39.                     Shell_NotifyIcon(NIM_DELETE, &nid);
  40.                     nid.cbSize = 0;
  41.                     return 0;
  42.                 case 3:
  43.                     GetCursorPos(&point);
  44.                     TrackPopupMenu(GetSubMenu(hmenuRoot, 0), TPM_BOTTOMALIGN | TPM_RIGHTALIGN, point.x, point.y, 0, hwnd, NULL);
  45.                     return 0;
  46.             }
  47.             break;
  48.         case WM_NOTIFYICON:
  49.             switch(lParam) {
  50.                 case WM_LBUTTONDOWN:
  51.                     GetCursorPos(&point);
  52.                     TrackPopupMenu(GetSubMenu(hmenuRoot, 0), TPM_BOTTOMALIGN | TPM_RIGHTALIGN, point.x, point.y, 0, hwnd, NULL);
  53.                     return 0;
  54.                 case WM_RBUTTONDOWN:
  55.                     MessageBox(NULL, "R", "标题", MB_OK);
  56.                     return 0;
  57.             }
  58.             break;
  59.         case WM_PAINT:
  60.             hdc = BeginPaint(hwnd, &ps);
  61.             GetClientRect(hwnd, &rect);
  62.             DrawText(hdc, TEXT("大家好,这是我的第一个窗口程序!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  63.             EndPaint(hwnd, &ps);
  64.             return 0;
  65.         case WM_DESTROY:
  66.             SendMessage(hwnd, WM_COMMAND, 2, 0);
  67.             DestroyMenu(hmenuRoot);
  68.             PostQuitMessage(0);
  69.             return 0;
  70.     }
  71.     return DefWindowProc(hwnd, message, wParam, lParam);
  72. }

  73. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
  74.     HWND hwnd;
  75.     MSG msg;
  76.     WNDCLASS wndclass;
  77.     wndclass.style = CS_HREDRAW | CS_VREDRAW;
  78.     wndclass.lpfnWndProc = WndProc;
  79.     wndclass.cbClsExtra = 0;
  80.     wndclass.cbWndExtra = 0;
  81.     wndclass.hInstance = hInstance;
  82.     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  83.     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  84.     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  85.     wndclass.lpszMenuName = NULL;
  86.     wndclass.lpszClassName = szAppName;
  87.     if(!RegisterClass(&wndclass)) {
  88.         MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
  89.         return 0;
  90.     }
  91.     hwnd = CreateWindow(szAppName, TEXT("鱼C工作室"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
  92.             CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
  93.     ShowWindow(hwnd, iCmdShow);
  94.     UpdateWindow(hwnd);
  95.     while(GetMessage(&msg, NULL, 0, 0)) {
  96.         TranslateMessage(&msg);
  97.         DispatchMessage(&msg);
  98.     }
  99.     return msg.wParam;
  100. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-9 20:31:39 | 显示全部楼层    本楼为最佳答案   
本帖最后由 人造人 于 2021-11-9 20:33 编辑
  1. #include <windows.h>
  2. #include <wchar.h>
  3. #include <strsafe.h>

  4. #define WM_NOTIFYICON (WM_USER + 1)

  5. HMENU hmenuRoot = NULL;
  6. NOTIFYICONDATA nid;
  7. const TCHAR szAppName[] = TEXT("MyWindows");

  8. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
  9.     HDC hdc;
  10.     PAINTSTRUCT ps;
  11.     RECT rect;
  12.     POINT point;
  13.     switch(message) {
  14.         case WM_CREATE:
  15.             hmenuRoot = CreateMenu();
  16.             HMENU hmenuPopup = CreatePopupMenu();
  17.             AppendMenu(hmenuPopup, MF_STRING, 1, TEXT("A"));
  18.             AppendMenu(hmenuPopup, MF_STRING, 2, TEXT("B"));
  19.             AppendMenu(hmenuPopup, MF_STRING, 3, TEXT("C"));
  20.             AppendMenu(hmenuRoot, MF_POPUP, (UINT_PTR)hmenuPopup, TEXT("MA"));
  21.             SetMenu(hwnd, hmenuRoot);
  22.             return 0;
  23.         case WM_COMMAND:
  24.             switch(LOWORD(wParam)) {
  25.                 case 1:
  26.                     if(nid.cbSize == sizeof(nid)) {
  27.                         DestroyIcon(nid.hIcon);
  28.                     }
  29.                     ZeroMemory(&nid, sizeof(nid));
  30.                     nid.cbSize = sizeof(nid);
  31.                     nid.hWnd = hwnd;
  32.                     nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
  33.                     nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  34.                     StringCchCopy(nid.szTip, sizeof(nid.szTip), szAppName);
  35.                     nid.uCallbackMessage = WM_NOTIFYICON;
  36.                     Shell_NotifyIcon(NIM_ADD, &nid);
  37.                     return 0;
  38.                 case 2:
  39.                     Shell_NotifyIcon(NIM_DELETE, &nid);
  40.                     nid.cbSize = 0;
  41.                     return 0;
  42.                 case 3:
  43.                     GetCursorPos(&point);
  44.                     TrackPopupMenu(GetSubMenu(hmenuRoot, 0), TPM_BOTTOMALIGN | TPM_RIGHTALIGN, point.x, point.y, 0, hwnd, NULL);
  45.                     return 0;
  46.             }
  47.             break;
  48.         case WM_NOTIFYICON:
  49.             switch(lParam) {
  50.                 case WM_LBUTTONDOWN:
  51.                     GetCursorPos(&point);
  52.                     TrackPopupMenu(GetSubMenu(hmenuRoot, 0), TPM_BOTTOMALIGN | TPM_RIGHTALIGN, point.x, point.y, 0, hwnd, NULL);
  53.                     return 0;
  54.                 case WM_RBUTTONDOWN:
  55.                     MessageBox(NULL, "R", "标题", MB_OK);
  56.                     return 0;
  57.             }
  58.             break;
  59.         case WM_PAINT:
  60.             hdc = BeginPaint(hwnd, &ps);
  61.             GetClientRect(hwnd, &rect);
  62.             DrawText(hdc, TEXT("大家好,这是我的第一个窗口程序!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  63.             EndPaint(hwnd, &ps);
  64.             return 0;
  65.         case WM_DESTROY:
  66.             SendMessage(hwnd, WM_COMMAND, 2, 0);
  67.             DestroyMenu(hmenuRoot);
  68.             PostQuitMessage(0);
  69.             return 0;
  70.     }
  71.     return DefWindowProc(hwnd, message, wParam, lParam);
  72. }

  73. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
  74.     HWND hwnd;
  75.     MSG msg;
  76.     WNDCLASS wndclass;
  77.     wndclass.style = CS_HREDRAW | CS_VREDRAW;
  78.     wndclass.lpfnWndProc = WndProc;
  79.     wndclass.cbClsExtra = 0;
  80.     wndclass.cbWndExtra = 0;
  81.     wndclass.hInstance = hInstance;
  82.     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  83.     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  84.     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  85.     wndclass.lpszMenuName = NULL;
  86.     wndclass.lpszClassName = szAppName;
  87.     if(!RegisterClass(&wndclass)) {
  88.         MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
  89.         return 0;
  90.     }
  91.     hwnd = CreateWindow(szAppName, TEXT("鱼C工作室"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
  92.             CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
  93.     ShowWindow(hwnd, iCmdShow);
  94.     UpdateWindow(hwnd);
  95.     while(GetMessage(&msg, NULL, 0, 0)) {
  96.         TranslateMessage(&msg);
  97.         DispatchMessage(&msg);
  98.     }
  99.     return msg.wParam;
  100. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-9 20:50:42 | 显示全部楼层
谢谢 楼上这位仁兄 。实现了有个窗口  单我还是想在系统托盘区域显示。。。想想QQ 似的 有个小小的图标那种
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-9 20:53:42 | 显示全部楼层
xinbeyon 发表于 2021-11-9 20:50
谢谢 楼上这位仁兄 。实现了有个窗口  单我还是想在系统托盘区域显示。。。想想QQ 似的 有个小小的图标那种 ...

你那边没有托盘图标?
不能单击托盘图标?
左键右键都没反应?
看代码,代码中写了什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-9 20:54:39 | 显示全部楼层
左键/右键单击托盘图标的代码
  1.         case WM_NOTIFYICON:
  2.             switch(lParam) {
  3.                 case WM_LBUTTONDOWN:
  4.                     GetCursorPos(&point);
  5.                     TrackPopupMenu(GetSubMenu(hmenuRoot, 0), TPM_BOTTOMALIGN | TPM_RIGHTALIGN, point.x, point.y, 0, hwnd, NULL);
  6.                     return 0;
  7.                 case WM_RBUTTONDOWN:
  8.                     MessageBox(NULL, "R", "标题", MB_OK);
  9.                     return 0;
  10.             }
  11.             break;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-9 20:56:03 | 显示全部楼层
点了A 托盘去有图标了   大神 你的代码好干净   注释都没有  哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-9 20:58:28 | 显示全部楼层
哦,我忘了
左上角的菜单栏 MA
A 添加托盘图标
B 删除托盘图标
C 当前鼠标位置弹出菜单

你不看代码的吗?
你的问题全在代码中的说
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-9 20:58:58 | 显示全部楼层
xinbeyon 发表于 2021-11-9 20:56
点了A 托盘去有图标了   大神 你的代码好干净   注释都没有  哈哈哈

^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-9 21:00:31 | 显示全部楼层
高手  厉害   点赞
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-9 21:05:16 | 显示全部楼层
这也太厉害了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-9 21:10:13 | 显示全部楼层

花了大概 9 个多小时,^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-9 21:14:29 | 显示全部楼层
辛苦辛苦了  佩服  我昨天琢磨了2小时 都没整明白 惭愧惭愧呀  今天一直在线等你大神来指点一二!! 我目前代买太长还看不太懂  大神能把最核心拿段 单摘出来  我研究研究  好以后封装好   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-9 21:18:12 | 显示全部楼层
xinbeyon 发表于 2021-11-9 21:14
辛苦辛苦了  佩服  我昨天琢磨了2小时 都没整明白 惭愧惭愧呀  今天一直在线等你大神来指点一二!! 我目前 ...

核心的话,感觉就是这个函数吧,Shell_NotifyIcon
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-9 21:19:59 | 显示全部楼层
xinbeyon 发表于 2021-11-9 21:14
辛苦辛苦了  佩服  我昨天琢磨了2小时 都没整明白 惭愧惭愧呀  今天一直在线等你大神来指点一二!! 我目前 ...

试试数据结构与算法,可以大幅度提高你的编程水平
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-9 22:04:00 | 显示全部楼层
核心的话,感觉就是这个函数吧,Shell_NotifyIcon


是呀里面要设置好多了东西  ,我以为像模拟 鼠标 键盘那样简单!!一上来就直接蒙了!!我现在就想简单调用  好调试的时候 来代替C 语言那个黑框框。。。在托盘区实现个冒泡信息  挺不错的  哎  还的学习呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 17:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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