Вожможно ли сделать сворачивание в трей при закрытии программы на C (Windows)? У меня есть программа, которая должна работать всё время, пока включен ПК, но не очень удобно, когда она висит в панеле. Возможно ли сделать сворачивание в трей при закрытии программы? И если да, то как?
Да, можно реализовать сворачивание программы в трей при закрытии на C для Windows. Для этого необходимо использовать функцию Shell_NotifyIcon из Windows API.
Пример кода:
#include <windows.h> #define TRAY_ICON_ID 1 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: { // Инициализация иконки в трее NOTIFYICONDATA nid; ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hwnd; nid.uID = TRAY_ICON_ID; nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage = WM_USER; nid.hIcon = LoadIcon(NULL, IDI_APPLICATION); lstrcpy(nid.szTip, "Название программы"); Shell_NotifyIcon(NIM_ADD, &nid); } break; case WM_USER: { if (LOWORD(lParam) == WM_LBUTTONUP) { // Возвращаем программу обратно на экран при нажатии на иконку в трее // Например, показываем окно с помощью функции ShowWindow(hwnd, SW_SHOW); } } break; case WM_CLOSE: { // Сворачиваем программу в трей при закрытии ShowWindow(hwnd, SW_HIDE); return 0; } default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } int main() { // Создание и регистрация окна WNDCLASS wc = {0}; wc.lpfnWndProc = WindowProc; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = "TrayApp"; RegisterClass(&wc); // Создание окна HWND hwnd = CreateWindow(wc.lpszClassName, "TrayApp", 0, 0, 0, 0, 0, 0, 0, wc.hInstance, 0); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
Этот код создаст окно программы, которое будет сворачиваться в трей при закрытии. При нажатии на иконку в трее окно будет возвращаться на экран. Не забудьте установить обработчик для WM_USER, чтобы обрабатывать нажатия на иконку в трее.
Да, можно реализовать сворачивание программы в трей при закрытии на C для Windows. Для этого необходимо использовать функцию Shell_NotifyIcon из Windows API.
Пример кода:
#include <windows.h>#define TRAY_ICON_ID 1
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
{
// Инициализация иконки в трее
NOTIFYICONDATA nid;
ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hwnd;
nid.uID = TRAY_ICON_ID;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_USER;
nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
lstrcpy(nid.szTip, "Название программы");
Shell_NotifyIcon(NIM_ADD, &nid);
}
break;
case WM_USER:
{
if (LOWORD(lParam) == WM_LBUTTONUP)
{
// Возвращаем программу обратно на экран при нажатии на иконку в трее
// Например, показываем окно с помощью функции ShowWindow(hwnd, SW_SHOW);
}
}
break;
case WM_CLOSE:
{
// Сворачиваем программу в трей при закрытии
ShowWindow(hwnd, SW_HIDE);
return 0;
}
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
int main()
{
// Создание и регистрация окна
WNDCLASS wc = {0};
wc.lpfnWndProc = WindowProc;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = "TrayApp";
RegisterClass(&wc);
// Создание окна
HWND hwnd = CreateWindow(wc.lpszClassName, "TrayApp", 0, 0, 0, 0, 0, 0, 0, wc.hInstance, 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
Этот код создаст окно программы, которое будет сворачиваться в трей при закрытии. При нажатии на иконку в трее окно будет возвращаться на экран. Не забудьте установить обработчик для WM_USER, чтобы обрабатывать нажатия на иконку в трее.