Запуск приложения в фоновом режиме

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

вот у меня есть собранный exe файл из main.cpp. как мне сделать чтобы мое main.exe приложение не выключалось после нажатия на крестик, а так же оставалось в фоновых приложениях. Возможно мне нужно в c++ файле это реализовать? Приложение консольное


Ответы (1 шт):

Автор решения: LShadow77

Вот, накатал пример. Должен работать (у меня работает), но если есть неточности или ошибки, пусть камрады поправят. При вводе '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);
}
→ Ссылка