Здесь покажу как сделать вот такое приложение, которое добавит иконку и меню в область уведомлений, а так-же покажу как сделать всплывающую подсказку.
Для того чтобы отобразить иконку, подсказку, всплывающую подсказку в область уведомлений, отобразить меню при нажатие на правую кнопку мыши по иконки, или удалить, то нужно использовать функцию Shell_NotifyIcon,
BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATAA lpData
);
Параметры:
dwMessage:
NIM_ADD - добавляет иконку.
NIM_MODIFY - модифицирует область уведомлений.
NIM_DELETE - удаляет иконку.
PNOTIFYICONDATA:
Настройка...
resource.h:
#define IDI_ICON_SYS_TRAY1 100 #define IDR_POPUPMENU 101 #define IDM_HELLO 102 #define IDM_CLOSE 103
resource.rc
#include <windows.h> #include <commctrl.h> #include <richedit.h> #include "resource.h" IDI_ICON_SYS_TRAY1 ICON "systray_icon.ico" IDR_POPUPMENU MENU { POPUP "TEST" { MENUITEM "Hello", IDM_HELLO MENUITEM "Close", IDM_CLOSE } }
main.c:
#include <windows.h> #include <commctrl.h> #include "resource.h" #define WM_USR_NOTIF WM_USER + 1 #ifndef NIF_SHOWTIP #define NIF_SHOWTIP 0x00000080 #endif NOTIFYICONDATA notif; const char appname[] = "System Tray Win32 Demo"; void show_notification(int duration, char *title, char *message) { notif.uTimeout = duration; strcpy(notif.szInfo, message); strcpy(notif.szInfoTitle, title); Shell_NotifyIcon(NIM_MODIFY, ¬if); } int show_popup(HWND hwnd) { HMENU hmMenu; HMENU hmSubMenu; POINT lpClickedPoint; GetCursorPos(&lpClickedPoint); hmMenu = LoadMenu(NULL, MAKEINTRESOURCE(IDR_POPUPMENU)); hmSubMenu = GetSubMenu(hmMenu, 0); if(!hmSubMenu) { DestroyMenu(hmMenu); return -1; } SetForegroundWindow(hwnd); TrackPopupMenu(hmSubMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_BOTTOMALIGN, lpClickedPoint.x, lpClickedPoint.y, 0, hwnd, NULL); SendMessage(hwnd, WM_NULL, 0, 0); DestroyMenu(hmMenu); return 0; } LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { case WM_CREATE: if(!Shell_NotifyIcon(NIM_ADD, ¬if)) DestroyWindow(hwnd); break; case WM_USR_NOTIF: switch(LOWORD(lParam)) { case WM_RBUTTONDOWN: if(show_popup(hwnd) == -1) return -1; break; } break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDM_HELLO: show_notification(5000, appname, "Hello!"); return; break; case IDM_CLOSE: SendMessage(hwnd, WM_DESTROY, 0, 0); break; } case WM_DESTROY: { Shell_NotifyIcon(NIM_DELETE, ¬if); PostQuitMessage(0); break; } default: return DefWindowProc(hwnd, Message, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hwnd; MSG msg; memset(&wc,0,sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "WindowClass"; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK); return 0; } hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass", appname, WS_VISIBLE|WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL,NULL,hInstance,NULL); if(hwnd == NULL) { MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK); return 0; } notif.cbSize = sizeof(NOTIFYICONDATA); notif.uID = 100; notif.hWnd = hwnd; notif.uFlags = NIF_ICON | NIF_SHOWTIP | NIF_INFO | NIF_MESSAGE | NIF_TIP; notif.hIcon = LoadIcon(hInstance, (LPCTSTR)MAKEINTRESOURCE(IDI_ICON_SYS_TRAY1)); strcpy(notif.szTip, appname); notif.uCallbackMessage = WM_USR_NOTIF; notif.dwInfoFlags = NIIF_INFO; if(!Shell_NotifyIcon(NIM_ADD, ¬if)) return 0; while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }