Nick_Wang94 2016-08-04 10:49 采纳率: 50%
浏览 2170
已采纳

windows编程关闭窗口时进程还在后台运行

代码如下:

 #include <Windows.h>
#include <stdio.h>

/*
* 窗口的回调函数
*/
LRESULT CALLBACK WindowProc(HWND hwnd,      // handle to window
    UINT uMsg,      // message identifier
    WPARAM wParam,  // first message parameter
    LPARAM lParam)   // second message parameter
{
    HDC hDC;
    PAINTSTRUCT ps;
    switch (uMsg)
    {
    case WM_PAINT:
        /*
         * 窗口重绘时调用
         * 只有在WM_PAINT消息中才可以使用BeginPaint、EndPaint
         * 其他消息使用GetDC、ReleaseDC
         */
        hDC = BeginPaint(hwnd, &ps);
        TextOut(hDC, 0, 50, "这是在WM_PAINT消息中重绘的文字", strlen("这是在WM_PAINT消息中重绘的文字"));
        EndPaint(hwnd, &ps);
        break;
    case WM_CHAR:
        MessageBox(hwnd, "WM_CHAR消息触发了", "提示", MB_OK);
        break;  
    case WM_LBUTTONDOWN:
        hDC = GetDC(hwnd);
        TextOut(hDC, 0, 70, "这是在WM_LBUTTONDOWN消息中重绘的文字", strlen("这是在WM_LBUTTONDOWN消息中重绘的文字"));
        ReleaseDC(hwnd, hDC);
        break;
    case WM_CLOSE:
        if (IDYES == MessageBox(hwnd, "确定要退出吗?", "提示", MB_YESNO))
        {
            //确定退出,销毁窗口,抛出一个WM_DESTYRY的消息
            DestroyWindow(hwnd); 
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,      // handle to current instance
    HINSTANCE hPrevInstance,  // handle to previous instance
    LPSTR lpCmdLine,          // command line
    int nCmdShow)              // show state
{
    //第一步、设计窗口类
    WNDCLASS wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW; //设置水平竖直重绘,发送WM_PAINT消息
    wndclass.lpfnWndProc = WindowProc; //指定窗口的回调函数
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0; //两个额外数据
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_CROSS);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = "myWindowClass";

    //第二步、注册窗口类
    RegisterClass(&wndclass);

    //第三步、创建窗口
    HWND hWnd = CreateWindow(
        "myWindowClass",    //窗口类的名字
        "my first window",  //窗口标题
        WS_OVERLAPPEDWINDOW,    //样式
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, //左上角坐标,宽高
        NULL, //父窗口
        NULL, //菜单
        hInstance, //实例
        NULL); //附加参数

    //第四部、显示更新窗口
    ShowWindow(hWnd, SW_SHOWNORMAL); //正常显示窗口
    UpdateWindow(hWnd); //更新窗口

    //第五步、消息循环
    MSG msg;
    while (GetMessageA(&msg, hWnd, 0, 0))
    {
        TranslateMessage(&msg); //翻译消息
        DispatchMessageA(&msg); //将消息传入窗口的回调函数
    }

    return 0;
}

  • 写回答

1条回答

  • Nick_Wang94 2016-08-04 10:59
    关注

    我知道答案了,在GetMessage的时候第二个参数应该传NULL表示接受这个线程的消息

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器