Запуск приложения в фоновом режиме
вот у меня есть скрытые значки, это приложения запущенные в фоновом режиме как я понимаю.

вот у меня есть собранный exe файл из main.cpp. как мне сделать чтобы мое main.exe приложение не выключалось после нажатия на крестик, а так же оставалось в фоновых приложениях. Возможно мне нужно в c++ файле это реализовать? Приложение консольное
Ответы (1 шт):
Вот, накатал пример. Должен работать (у меня работает), но если есть неточности или ошибки, пусть камрады поправят. При вводе 'h' скрывает консоль и размещает стандартную иконку приложения в трее (может появиться в скрытых значках панели). При двойном клике по иконке удаляет её из трея и снова отображает консоль. При вводе 'q' - выход. Как выяснилось, субклассить окно консоли, унаследованное от другого процесса, нельзя. По-этому для обработки событий от иконки в этом примере создаётся дополнительное невидимое окно.
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define WMU_TRAY_ICON_MESSAGE (WM_USER+1)
#define CLASS_NAME "UnvisibleHandlerWin"
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HWND g_hConWnd;
bool g_bHidden = false;
NOTIFYICONDATA g_niData;
int main()
{
WNDCLASS wcl;
HWND hWnd;
HINSTANCE hInst;
MSG msg;
char c;
g_hConWnd = GetConsoleWindow();
if (!g_hConWnd) return 1;
hInst = GetModuleHandle(NULL);
ZeroMemory(&wcl,sizeof(WNDCLASS));
wcl.lpfnWndProc = WndProc;
wcl.hInstance = hInst;
wcl.lpszClassName = CLASS_NAME;
RegisterClass(&wcl);
hWnd = CreateWindowEx(0,CLASS_NAME,"",0,0,0,0,0,NULL,NULL,hInst,NULL);
if (!hWnd) return 1;
ZeroMemory(&g_niData,sizeof(NOTIFYICONDATA));
g_niData.cbSize = sizeof(NOTIFYICONDATA);
g_niData.uID = 0;
g_niData.uFlags = NIF_ICON|NIF_MESSAGE;
g_niData.hIcon = LoadIcon(NULL,IDI_APPLICATION);
g_niData.hWnd = hWnd;
g_niData.uCallbackMessage = WMU_TRAY_ICON_MESSAGE;
fputs("Inputs:\n"
" h - minimizing console to the system tray\n"
" q - quit\n",stdout);
while (true)
{
while (PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
DispatchMessage(&msg);
if (g_bHidden) continue;
fputs("> ", stdout);
while (true)
{
c = getc(stdin);
if ((c!=0xA)&&(c!=0xD)) break;
}
if (c=='h')
{
if (!Shell_NotifyIcon(NIM_ADD, &g_niData))
{
fputs("Something wrong. Can't create the notification icon!\n",stdout);
continue;
}
ShowWindow(g_hConWnd,SW_HIDE);
g_bHidden = true;
continue;
}
if (c=='q') break;
fputs("Unknown input, try again!\n", stdout);
}
DestroyWindow(hWnd);
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg==WMU_TRAY_ICON_MESSAGE)
{
if (lParam==WM_LBUTTONDBLCLK)
{
Shell_NotifyIcon(NIM_DELETE, &g_niData);
ShowWindow(g_hConWnd,SW_SHOW);
SetForegroundWindow(g_hConWnd);
g_bHidden = false;
}
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
