首页 > 解决方案 > 在 Windows 中未调用 C++ WndProc 事件 WM_QUERYENDSESSION

问题描述

这是我的代码示例:

LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdParam, int iCmdShow)
{
    static char szAppName[] = "hidden window";

    HWND        hWnd = GetActiveWindow();

    WNDCLASSEX  wndclass;
    wndclass.cbSize = sizeof(wndclass);
    wndclass.style = CS_OWNDC;
    wndclass.lpfnWndProc = WindowProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = NULL;
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
    wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wndclass);

    hWnd = CreateWindow(
        szAppName,
        "hidden window", // window caption
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);

    ShowWindow(hWnd, SW_HIDE);
    UpdateWindow(hWnd);

    // Some code
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    ofstream myfile;
    myfile.open("log.txt", ios::app);
    myfile << "I was called \n";
    switch (uMsg)
    {
    case  WM_QUERYENDSESSION:
    {
        myfile << "WM_QUERYENDSESSION CALLED\n";
        return TRUE;

        break;
    }
    }
    myfile.close();

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

我注册了处理程序wndclass.lpfnWndProc = WindowProc;,WindowProc 被触发了几次,并且仅在我启动应用程序时才写入“我被称为 \n”,但是当我关闭系统时,绝对没有任何内容写入 log.txt,因此不会触发处理程序。我尝试了不同的例子,但对我没有任何作用。有什么想法吗?

标签: c++visual-c++

解决方案


推荐阅读