鱼C论坛

 找回密码
 立即注册
查看: 3206|回复: 4

[已解决]win32模态对话框的流程

[复制链接]
发表于 2019-9-14 22:05:56 | 显示全部楼层 |阅读模式
66鱼币
本帖最后由 独一无② 于 2019-9-15 10:57 编辑

最近学win32遇到了一个问题,纠结了很久...
问题是在窗口处理回调中调用MessageBox的流程不符合常理
键盘消息的话有击键消息和字符消息,假如我按下了一个a键,那么应该是先收到击键消息A,然后是字符消息a。
上面的没问题,问题是在里面调用MessageBox的时候,结果尽然是先弹出了字符消息的对话框,然后是击键消息的对话框。
我自己调试了下程序,消息的流程应该是没问题的,就是在击键消息中的MessageBox中,又会先跳转到字符消息的MessageBox,很奇怪,求大佬解释下
#include <windows.h>

/*
问题:
按下键盘a,为什么先弹了第二处的MessageBox,再弹出第一处的MessageBox
自己调试过,流程好像没问题,是先调了第一处,再调第二处。只是弹框的顺序反了
*/
LRESULT CALLBACK WinProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wndClass = {0};
    wndClass.lpfnWndProc = WinProc;
    wndClass.lpszClassName = TEXT("keyTest");
    
    RegisterClass(&wndClass);
    
    HWND hwnd = CreateWindow(TEXT("keyTest"), TEXT("keyBoard"),
        WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL,NULL,hInstance,NULL);
    
    ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);
    
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return 0;
}

LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_KEYDOWN: //输入法得切换英文
        {
            TCHAR szBuff[MAXBYTE] = { 0 };
            if (wParam >= 'A' && wParam <= 'Z')
            {
                wsprintf(szBuff, TEXT("OnKeyDown: %c\r\n"), wParam);
                MessageBox(hwnd, szBuff, NULL, MB_OK); //第一处
            }
            OutputDebugString(szBuff);
            return 0;
        }
        case WM_CHAR:
        {
            TCHAR szBuff[MAXBYTE] = { 0 };
            if (wParam >= 'a' && wParam <= 'z')
            {
                wsprintf(szBuff, TEXT("OnChar: %c\r\n"), wParam);
                MessageBox(hwnd, szBuff, NULL, MB_OK);//第二处
            }
            OutputDebugString(szBuff);
            return 0;
        }
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
所以现在的运行结果是先出来第二处的对话框,然后是第一处的对话框。这个问题我觉得应该是和模态对话框有关,不知道这个模态对话框是如何运行的?

最佳答案

查看完整内容

https://www.cnblogs.com/zhuyf87/archive/2012/12/12/2815211.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-14 22:05:57 | 显示全部楼层    本楼为最佳答案   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-15 02:19:41 | 显示全部楼层
贴完整代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-15 10:58:19 | 显示全部楼层

你好,已更新上完整代码。纠结了好几天...感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-15 14:16:34 | 显示全部楼层
人造人 发表于 2019-9-14 22:05
https://www.cnblogs.com/zhuyf87/archive/2012/12/12/2815211.html

感谢感谢!之前也百度搜索了好多,但是一直没有搜索到关键点,说明知识量不够,搜索的方向有偏差
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-21 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表