c ++ - Hvordan forhindrer jeg et Win32-program i at køre i baggrunden, når hovedvinduet er lukket?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er en nybegynder til Win32 API, men jeg er med erfaring med C ++. Til læringsformål har jeg skabt, ifølge referencer, tutorials og eksempler, en meget enkel Win32-applikation.


Problemet er, efter at hovedvinduet er lukket, kører processen stadig i baggrunden. Hvordan kan jeg forhindre dette? I min WndProc-funktion har jeg en WM\_DESTROY-sag med DestroyWindow, men det synes ikke at være et trick. Koden er nedenfor:


#include <cstdio>
#include <cstdlib>

#ifdef UNICODE
#include <tchar.h>
#endif

#include <Windows.h>

HINSTANCE hinst;
HWND hwnd;

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

#ifdef UNICODE
int WINAPI \_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
#else
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
#endif
{
    MSG msg;
    WNDCLASSEX mainclass;
    BOOL bRet;
    UNREFERENCED\_PARAMETER(lpCmdLine);

    mainclass.cbSize =          sizeof(WNDCLASSEX);
    mainclass.style =           CS\_VREDRAW | CS\_HREDRAW;
    mainclass.lpfnWndProc =     (WNDPROC) WndProc;
    mainclass.cbClsExtra =      NULL;
    mainclass.cbWndExtra =      NULL;
    mainclass.hInstance =       hInstance;
    mainclass.hIcon =           NULL;
    mainclass.hCursor =         LoadCursor(NULL, IDC\_ARROW);
    mainclass.hbrBackground =   (HBRUSH) COLOR\_WINDOW;
    mainclass.lpszMenuName =    NULL;
    mainclass.lpszClassName =   TEXT("MainWindowClass");
    mainclass.hIconSm =         NULL;

    if (!RegisterClassEx(&mainclass))
        return FALSE;

    hinst = hInstance;

    hwnd = CreateWindowEx(
        WS\_EX\_WINDOWEDGE,
        TEXT("MainWindowClass"),
        TEXT("Test Window"),
        WS\_CAPTION | WS\_VISIBLE | WS\_SIZEBOX | WS\_SYSMENU | WS\_MINIMIZEBOX | WS\_MAXIMIZEBOX,
        CW\_USEDEFAULT,
        CW\_USEDEFAULT,
        CW\_USEDEFAULT,
        CW\_USEDEFAULT,
        NULL,
        NULL,
        hinst,
        NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
        if (bRet != -1)
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    switch(uMsg)
    {
    case WM\_DESTROY:
        DestroyWindow(hwnd);
        break;
    case WM\_PAINT:
        BeginPaint(hwnd, &ps);
        EndPaint(hwnd, &ps);
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

Bedste reference


Du skal ikke ringe DestroyWindow(). Meddelelsen fortæller dig, at dit vindue allerede er blevet ødelagt. Ring til PostQuitMessage(0) for at afslutte programmet.

Andre referencer 1


I din WndProc tilføj en sag til WM\_CLOSE og ring PostQuitMessage.


LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  case WM\_CLOSE:
  PostQuitMessage(0);
  break;
  // other cases
}


Når bruger klikker på lukkeknappen (eller fra sys menuen) vil Windows sende WM\_CLOSE beskeden. Dette vil medføre, at din primære Windows-meddelelseshåndterer afslutter. Dette vil igen sikre din ansøgning udgang korrekt.