2012-03-05 34 views
4

我是Win32 API的初學者,但我對C++有着豐富的經驗。爲了學習目的,我根據參考資料,教程和示例創建了一個非常簡單的Win32應用程序。如何防止Win32應用程序在主窗口關閉後在後臺運行?

問題是,在主窗口關閉後,其進程仍在後臺運行。我怎樣才能防止這一點?在我的WndProc函數中,我確實有一個使用DestroyWindow的WM_DESTROY案例,但它似乎並沒有做到這一點。代碼如下:

#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; 
} 
+1

您可以使用調試器來幫助您。當您關閉主窗口並且程序仍在運行時,請暫停執行並查看調用堆棧以瞭解您的程序仍在忙於什麼。這可以爲您提供線索,瞭解您的程序希望您如何使其停止運行。例如,如果您發現程序仍在運行消息循環,則可以安排循環的終止條件得到滿足。 – 2012-03-05 18:14:49

+0

這是一個更好的參考/教程/例子:[Raymond Chen的C++ scratch程序](http://blogs.msdn.com/b/oldnewthing/archive/2005/04/22/410773.aspx)。這裏是[C scratch程序的鏈接](http://blogs.msdn.com/b/oldnewthing/archive/2003/07/23/54576.aspx)。 – 2012-03-05 19:24:37

回答

9

請勿撥打DestroyWindow()。消息告訴你,你的窗戶已經被毀壞了。致電PostQuitMessage(0)退出應用程序。

+1

實際上,你需要'WM_CLOSE'來觸發'DestroyWindow(hwnd)'。這可能是默認的。 – 2012-03-05 17:52:04

+0

啊,謝謝!我誤解了WM_DESTROY消息的使用。 PostQuitMessage(0)修復了它。 – Archimaredes 2012-03-05 17:55:54

+0

@BenVoigt它似乎是默認的。我不需要在表面自動DestroyWindow中添加這種情況。 – Archimaredes 2012-03-05 17:56:51

2

在你的WndProc中添加一個WM_CLOSE的例子並調用PostQuitMessage。

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

當用戶單擊關閉按鈕(或從sys菜單)Windows將發佈WM_CLOSE消息。這將導致您的主Windows消息處理程序退出。這反過來將確保您的應用程序正常退出。

相關問題