鱼C论坛

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

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

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

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

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

  8. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  9.     LPSTR lpCmdLine, int nCmdShow)
  10. {
  11.     WNDCLASS wndClass = {0};
  12.     wndClass.lpfnWndProc = WinProc;
  13.     wndClass.lpszClassName = TEXT("keyTest");
  14.    
  15.     RegisterClass(&wndClass);
  16.    
  17.     HWND hwnd = CreateWindow(TEXT("keyTest"), TEXT("keyBoard"),
  18.         WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  19.         NULL,NULL,hInstance,NULL);
  20.    
  21.     ShowWindow(hwnd,nCmdShow);
  22.     UpdateWindow(hwnd);
  23.    
  24.     MSG msg;
  25.     while (GetMessage(&msg, NULL, 0, 0))
  26.     {
  27.         TranslateMessage(&msg);
  28.         DispatchMessage(&msg);
  29.     }
  30.    
  31.     return 0;
  32. }

  33. LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  34. {
  35.     switch (uMsg)
  36.     {
  37.         case WM_KEYDOWN: //输入法得切换英文
  38.         {
  39.             TCHAR szBuff[MAXBYTE] = { 0 };
  40.             if (wParam >= 'A' && wParam <= 'Z')
  41.             {
  42.                 wsprintf(szBuff, TEXT("OnKeyDown: %c\r\n"), wParam);
  43.                 MessageBox(hwnd, szBuff, NULL, MB_OK); //第一处
  44.             }
  45.             OutputDebugString(szBuff);
  46.             return 0;
  47.         }
  48.         case WM_CHAR:
  49.         {
  50.             TCHAR szBuff[MAXBYTE] = { 0 };
  51.             if (wParam >= 'a' && wParam <= 'z')
  52.             {
  53.                 wsprintf(szBuff, TEXT("OnChar: %c\r\n"), wParam);
  54.                 MessageBox(hwnd, szBuff, NULL, MB_OK);//第二处
  55.             }
  56.             OutputDebugString(szBuff);
  57.             return 0;
  58.         }
  59.         case WM_DESTROY:
  60.         {
  61.             PostQuitMessage(0);
  62.             return 0;
  63.         }
  64.     }
  65.     return DefWindowProc(hwnd,uMsg,wParam,lParam);
  66. }
复制代码

所以现在的运行结果是先出来第二处的对话框,然后是第一处的对话框。这个问题我觉得应该是和模态对话框有关,不知道这个模态对话框是如何运行的?

最佳答案

查看完整内容

https://www.cnblogs.com/zhuyf87/archive/2012/12/12/2815211.html
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-14 22:05:57 | 显示全部楼层    本楼为最佳答案   
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-15 02:19:41 | 显示全部楼层
贴完整代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

你好,已更新上完整代码。纠结了好几天...感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

感谢感谢!之前也百度搜索了好多,但是一直没有搜索到关键点,说明知识量不够,搜索的方向有偏差
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-4 20:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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