独一无② 发表于 2019-9-14 22:05:56

win32模态对话框的流程

本帖最后由 独一无② 于 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 = { 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 = { 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);
}
所以现在的运行结果是先出来第二处的对话框,然后是第一处的对话框。这个问题我觉得应该是和模态对话框有关,不知道这个模态对话框是如何运行的?

人造人 发表于 2019-9-14 22:05:57

https://www.cnblogs.com/zhuyf87/archive/2012/12/12/2815211.html

人造人 发表于 2019-9-15 02:19:41

贴完整代码

独一无② 发表于 2019-9-15 10:58:19

人造人 发表于 2019-9-15 02:19
贴完整代码

你好,已更新上完整代码。纠结了好几天...感谢感谢

独一无② 发表于 2019-9-15 14:16:34

人造人 发表于 2019-9-14 22:05
https://www.cnblogs.com/zhuyf87/archive/2012/12/12/2815211.html

感谢感谢!之前也百度搜索了好多,但是一直没有搜索到关键点,说明知识量不够,搜索的方向有偏差
页: [1]
查看完整版本: win32模态对话框的流程