Страницы

Поиск по вопросам

воскресенье, 16 февраля 2020 г.

Программа в трее без окна (WinAPI, C++)

#cpp #winapi


Нужно создать приложение, которое не будет иметь ни видимого окна, ни иконки на панели
задач, и работать только из трея.
Подскажите пожалуйста последовательность действий, а так же с какими параметрами
нужно регистрировать WNDCLASSEX и использовать CreateWindow.
    


Ответы

Ответ 1



Если видимого окна нет, имеет смысл создать Message-Only Window, окно без графического представления, предназначенное исключительно для обработки оконных сообщений: const HWND g_hWnd = CreateWindowEx( /* dwExStyle */ 0, /* lpClassName */ szClassName, /* lpWindowName */ NULL, /* dwStyle */ 0, /* x, y, w, h */ 0, 0, 0, 0, /* hWndParent */ HWND_MESSAGE, /* hMenu */ NULL, /* hInstance */ g_hInst, /* lpParam */ NULL ); Затем обычным порядком создаёте значок в панели уведомлений: #define WM_USER_SHELLICON (WM_USER + 1) NOTIFYICONDATA data; data.cbSize = sizeof(data); data.hWnd = g_hWnd; data.uID = 1; // Можно поставить любой идентификатор, всё равно иконка только одна data.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; data.uCallbackMessage = WM_USER_SHELLICON; data.hIcon = LoadIcon(...); data.szTip = TEXT(...); // Или LoadResourceString, как вариант data.uVersion = NOTIFYICON_VERSION; Shell_NotifyIcon(NIM_ADD, &data);

Ответ 2



Как-то раз делал такую. Не скажу, что правильно :), но работало. Вот основной цикл: g_hInst = GetModuleHandle(NULL); char * szClassName = "EmptyWindow"; WNDCLASSEX wcex = {sizeof(wcex)}; wcex.lpfnWndProc = WndProc; wcex.hInstance = g_hInst; wcex.lpszClassName = szClassName; RegisterClassEx(&wcex); if (g_hWnd = CreateWindow(szClassName, NULL, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, g_hInst, NULL)); { ShowWindow(g_hWnd,SW_HIDE); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } Ну а треевскую иконку создавал в WM_CREATE. Не знаю, насколько это идеологически верно, но работало :)

Комментариев нет:

Отправить комментарий