You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows程序开发中RegisterClass调用失败问题求助

RegisterClass始终返回FALSE的Windows程序问题

我正在编写一个简单的Windows程序,但不知为何RegisterClass始终返回FALSE,不清楚问题出在哪里。

我已经设置了WNDCLASS结构体的lpszClassName、hInstance和lpfnWndProc成员。

以下是我的代码:

#include <windows.h>
#include <tchar.h>

template<typename T>
class BaseWindow {
public:
    static LRESULT CALLBACK WndProc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) {
        T* pThis = NULL;
        if (umsg == WM_NCCREATE) {
            CREATESTRUCT* pCreate = (CREATESTRUCT*)lparam;
            pThis = (T*)pCreate->lpCreateParams;
            SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThis);
            pThis->m_hwnd = hwnd;
        } else {
            pThis = (T*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
        }
        return pThis->HandleMessage(umsg, wparam, lparam);
    }
    HWND m_hwnd;
    BOOL cls_state = FALSE;
    BOOL Init() {
        WNDCLASS wc;
        wc.lpszClassName = ClassName();
        wc.hInstance = GetModuleHandle(NULL);
        wc.lpfnWndProc = T::WndProc;

        return RegisterClass(&wc);

    }
    HWND Create(const char* szWindowName, DWORD dwStyle) {
        if (cls_state == FALSE) {
            if (!Init()) {
                MessageBox(NULL, _T("Init Failed. :(")), _T("Error!"), MB_OK);
            }
            cls_state = TRUE;
        }
        return m_hwnd = CreateWindow(ClassName(), szWindowName, dwStyle, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, GetModuleHandle(NULL), this);
    }
    const char* ClassName() { return _T("BaseWindow Class"); }
};

class MainWindow : public BaseWindow<MainWindow> {
public:
    LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) {
        return DefWindowProc(m_hwnd, uMsg, wParam, lParam);
    }
    const char* ClassName() { return _T("MainWindow Class"); }
};

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) {


    MainWindow win;
    win.Create(_T("Mush!"), 0);

    ShowWindow(win.m_hwnd, nCmdShow);

    MSG msg;

    while (GetMessage (&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

编辑补充

我实际上几乎全写错了(具体错误不再罗列,可查看相关解答),显然我是Windows API的新手。

内容的提问来源于stack exchange,提问作者marcthird

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:24:51