你不会了解 发表于 2021-11-14 04:20

Win32的新项目就一个空白窗口一旦按键就会未响应。


#include <Windows.h>

// 函数声明
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
        // 消息分发
        switch (Msg)
        {
                case WM_DESTROY:
                        PostQuitMessage(EXIT_SUCCESS);
                        break;
                default:
                        break;
        }
        // 返回结果
        return DefWindowProc(hWnd, Msg, wParam, lParam);
}

// 入口函数
int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
        // 注册窗口类
        WNDCLASS wc = {};
        wc.lpszClassName = L"ExampleWindowClass";
        wc.hInstance = hInstance;
        wc.lpfnWndProc = WndProc;
        //wc.lpfnWndProc = DefWindowProc;
        if (!RegisterClass(&wc))
        {
                DWORD err = GetLastError();
                ExitThread(err);
        }

        // 创建窗口
        HWND hWnd = CreateWindowEx(0, wc.lpszClassName, L"Example", WS_OVERLAPPEDWINDOW | WS_TABSTOP, 200, 200, 300, 400, NULL, NULL, hInstance, NULL);
        if (!hWnd) {
                DWORD err = GetLastError();
                ExitThread(err);
        }

        // 显示窗口
        ShowWindow(hWnd, SW_SHOW);
        UpdateWindow(hWnd);

        // 消息处理
        MSG msg;
        while (GetMessage(&msg, hWnd, 0, 0) > 0)
        {
                // 翻译消息
                TranslateMessage(&msg);
                // 派发消息
                DispatchMessage(&msg);
        }

        // 返回结果
        return EXIT_SUCCESS;
}


环境:Win10 x64,Visual Studio 2022,项目属性字符集Unicode或多字节都试过

问题:

运行后,将创建一个 空白窗口,当窗口处于激活获得焦点时,

只要键盘有键按下,那么这个窗口就再也无法得到任何响应(但却不是未响应的卡死的那种)

除此之外,其他一切都正常,期间测试消息触发,加上按钮点击什么的,都可以。

苏紫方璇 发表于 2021-11-14 09:50

看着代码没啥问题,vs2015,2019测试也没问题

ryosga 发表于 2021-11-14 09:57

楼主可能发现了vs2022的bug

ESMGAL 发表于 2021-11-14 10:55

不知道所说的未响应是什么样的一个状态,上面的代码会处理所有消息,但是界面不会刷新。

你不会了解 发表于 2021-11-14 12:00

ESMGAL 发表于 2021-11-14 10:55
不知道所说的未响应是什么样的一个状态,上面的代码会处理所有消息,但是界面不会刷新。

不知道你用过OD之类的软件没,大概就和被OD点了暂停运行一样

你不会了解 发表于 2021-11-14 12:05

ryosga 发表于 2021-11-14 09:57
楼主可能发现了vs2022的bug

我用VS 2019创建一个新的解决方案,新的桌面应用向导空白项目,然后添加一个CPP文件,粘贴我的代码,启动运行,对着窗口按一下键盘,也是一样未响应。

hellozl 发表于 2021-11-14 12:25

事件处理函数对于WM_PAINT事件没有给出响应。

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
    case WM_PAINT:
      {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
            EndPaint(hwnd, &ps);
      }
      return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

你不会了解 发表于 2021-11-14 12:36

哎,完结撒花,问题出在 GetMessage(&msg, hWnd, 0, 0),改成GetMessage(&msg, NULL, 0, 0) 就可以了。

Spoofing 发表于 2021-11-14 13:40

页: [1]
查看完整版本: Win32的新项目就一个空白窗口一旦按键就会未响应。