首页 > 解决方案 > 捕获 WM_CHAR 消息时如何检测 UNICODE 字符?

问题描述

因此,我的窗口过程当前正在捕获所有 WM_CHAR 消息,它适用于 ASCII 字符,但是当我尝试类似以下操作时:

case 'ф':
    MessageBox(NULL, TEXT("Ф detected"), TEXT("key"), MB_OK);

由于某种原因它失败了。

我的方法有什么问题,我该如何解决?

编辑:源代码:

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     switch (message)
     {

          case WM_CHAR:
               switch(wParam)
               {

                  case '3':
                    MessageBox(NULL, TEXT("'3' was pressed"), TEXT("key detected"), MB_OK);
                    return 0;
                  case 'ф':
                    MessageBox(NULL, TEXT( "ф was pressed"), TEXT("key detected"), MB_OK);
                    return 0;


                  default:
                      return 0;
               }

          case WM_DESTROY :
               PostQuitMessage (0) ;
               return 0 ;


     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

标签: cwinapi

解决方案


非 Unicode 字符需要替换为 Unicode 字符switch-case

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     switch (message)
     {

          case WM_CHAR:
               switch(wParam)
               {

                  case L'3':
                    MessageBox(NULL, TEXT("'3' was pressed"), TEXT("key detected"), MB_OK);
                    return 0;
                  case L'ф':
                    MessageBox(NULL, TEXT( "ф was pressed"), TEXT("key detected"), MB_OK);
                    return 0;


                  default:
                      return 0;
               }

          case WM_DESTROY :
               PostQuitMessage (0) ;
               return 0 ;


     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

'ф'和的值L'ф'不同。的值'ф'和不在 ASCII 表中的其他字符通常被解析为'?'(63)


推荐阅读