c - 为什么创建窗口没有反应?

标签 c multithreading debugging winapi

当我通过CreateWindow函数创建名为'A'的窗口时,窗口'A'变得没有响应,但可以在它没有响应之前绘制它。

当我点击“登录”按钮时

Sign In

unsigned __stdcall ThreadFunc(void *lParam) {
    pMsgHead pmsgHead = new MsgHead;
    while (RecvMsg(ConnectSocket,pmsgHead,sizeof(MsgHead))) {
        switch (pmsgHead->dwCmd) {
        case WM_SIGN_IN:
            g_hMain=CreateWindow(szMainClass, L"A", WS_OVERLAPPEDWINDOW,
                200, 200, 250, 500, 0, 0, hInst, nullptr);
            ShowWindow(g_hMain, SW_SHOW);
            UpdateWindow(g_hMain);
            break;
        case WM_BROADCAST:
            //DrawText()
            break;
        }
    }
    _endthreadex(0);
    return 0;
}

但是当我点击“注册”按钮时,它会起作用。

Sign Up

        case IDB_SIGN_UP:
            g_hSignUp = CreateWindow(szSignUpClass, L"Sign Up", WS_OVERLAPPEDWINDOW,
                800, 200, 300, 300, 0, 0, hInst, nullptr);
            ShowWindow(g_hSignUp, SW_SHOW);
            UpdateWindow(g_hSignUp);
            break;
        case IDB_SIGN_IN:
        {
            TCHAR uname[20], psd[20];
            GetWindowText(g_hSignInuname, uname, 20);
            GetWindowText(g_hSignInpsd, psd, 20);
            pMsgHead pmsgHead = new MsgHead;
            pmsgHead->dwCmd = WM_SIGN_IN;
            wcscpy_s(pmsgHead->tszbuf, uname);
            wcscat_s(pmsgHead->tszbuf, L",");
            wcscat_s(pmsgHead->tszbuf, psd);
            SendMsg(ConnectSocket, pmsgHead, sizeof(MsgHead));
            break;
        }

我只是在Main线程的GetMessage函数和上面的RecvMsg中使用while循环,我使用单步调试程序,一个线程将等待

while(RecvMsg())
主线程将运行
case IDB_SIGN_IN:
中的“中断”然后返回0,如果我还是用单步调试,会提示not loaded 'wuser32.pdb'

最佳答案

您正在线程中创建窗口。这意味着该窗口与该线程具有亲和性。消息被发送到该线程消息队列。线程中没有消息循环,因此无法响应消息。

修复方法是在主线程中创建所有窗口。您应该向主窗口发送一条消息,要求创建其他窗口。这样你就可以确保你所有的窗口都是由主 UI 线程创建的。

关于c - 为什么创建窗口没有反应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29773325/

相关文章:

java - 自定义自动对焦的算法或开源实现

java - 从不同线程调用时查询超时

eclipse - 如何让 Eclipse 获取 Tomcat 类路径中的所有资源?

c++ - 调试断言失败文件、tokenScanner 和文本文件

调用 cudaMemcpyToSymbol 时出现 cudaErrorInvalidValue 错误

在 OCaml 函数的 C 实现中创建求和类型

将结构体成员复制到新结构体中

.NET:如何在特定线程上调用委托(delegate)? (ISynchronizeInvoke、Dispatcher、AsyncOperation、SynchronizationContext 等)

android - Android 中的时间延迟

asp.net - 一个用户的生产 ASP.NET webapp 错误,无法在开发中重现 - 我该如何调试?