对于DirectInput,以这种方式来处理用户输入的字符,是否太过低效?该怎么处理

对于DirectInput,以这种方式来处理用户输入的字符,是否太过低效?
C/C++ code

//...
    switch (g_stInputInfo.KeyValue)
    {
    case DIK_GRAVE:        UpdateText(DIK_GRAVE);    break;
    case DIK_NUMPAD0:
    case DIK_0:            UpdateText(DIK_NUMPAD0);    break;
    case DIK_NUMPAD1:
    case DIK_1:            UpdateText(DIK_NUMPAD1);    break;
    case DIK_NUMPAD2:
    case DIK_2:            UpdateText(DIK_NUMPAD2);    break;
    case DIK_NUMPAD3:
    case DIK_3:            UpdateText(DIK_NUMPAD3);    break;
    case DIK_NUMPAD4:
    case DIK_4:            UpdateText(DIK_NUMPAD4);    break;
    case DIK_NUMPAD5:
    case DIK_5:            UpdateText(DIK_NUMPAD5);    break;
    case DIK_NUMPAD6:
    case DIK_6:            UpdateText(DIK_NUMPAD6);    break;
    case DIK_NUMPAD7:
    case DIK_7:            UpdateText(DIK_NUMPAD7);    break;
    case DIK_NUMPAD8:
    case DIK_8:            UpdateText(DIK_NUMPAD8);    break;
    case DIK_NUMPAD9:
    case DIK_9:            UpdateText(DIK_NUMPAD9);    break;
    case DIK_MINUS:        UpdateText(DIK_MINUS);    break;
    case DIK_EQUALS:    UpdateText(DIK_EQUALS);    break;
    case DIK_Q:            UpdateText(DIK_Q);    break;
    case DIK_W:            UpdateText(DIK_W);    break;
    case DIK_E:            UpdateText(DIK_E);    break;
    case DIK_R:            UpdateText(DIK_R);    break;
    case DIK_T:            UpdateText(DIK_T);    break;
    case DIK_Y:            UpdateText(DIK_Y);    break;
    case DIK_U:            UpdateText(DIK_U);    break;
    case DIK_I:            UpdateText(DIK_I);    break;
    case DIK_O:            UpdateText(DIK_O);    break;
    case DIK_P:            UpdateText(DIK_P);    break;
    case DIK_LBRACKET:    UpdateText(DIK_LBRACKET);    break;
    case DIK_RBRACKET:    UpdateText(DIK_RBRACKET);    break;
    case DIK_A:            UpdateText(DIK_A);    break;
    case DIK_S:            UpdateText(DIK_S);    break;
    case DIK_D:            UpdateText(DIK_D);    break;
    case DIK_F:            UpdateText(DIK_F);    break;
    case DIK_G:            UpdateText(DIK_G);    break;
    case DIK_H:            UpdateText(DIK_H);    break;
    case DIK_J:            UpdateText(DIK_J);    break;
    case DIK_K:            UpdateText(DIK_K);    break;
    case DIK_L:            UpdateText(DIK_L);    break;
    case DIK_SEMICOLON:    UpdateText(DIK_SEMICOLON);    break;
    case DIK_APOSTROPHE:UpdateText(DIK_APOSTROPHE);    break;
    case DIK_Z:            UpdateText(DIK_Z);    break;
    case DIK_X:            UpdateText(DIK_X);    break;
    case DIK_C:            UpdateText(DIK_C);    break;
    case DIK_V:            UpdateText(DIK_V);    break;
    case DIK_B:            UpdateText(DIK_B);    break;
    case DIK_N:            UpdateText(DIK_N);    break;
    case DIK_M:            UpdateText(DIK_M);    break;
    case DIK_COMMA:        UpdateText(DIK_COMMA);    break;
    case DIK_PERIOD:    UpdateText(DIK_PERIOD);    break;
    case DIK_SLASH:        UpdateText(DIK_SLASH);    break;
    case DIK_MULTIPLY:    UpdateText(DIK_MULTIPLY);    break;
    case DIK_ADD:        UpdateText(DIK_ADD);    break;
    case DIK_SUBTRACT:    UpdateText(DIK_SUBTRACT);    break;
    case DIK_DECIMAL:    UpdateText(DIK_DECIMAL);    break;
    }
//...


void  CEditCTL::UpdateText(DWORD scancode)
{
    int ascii = ScanToASCII(scancode);
    // 0x14:VK_CAPITAL
    if ((GetKeyState(0x14)&0x1) || g_Input.GetKeyPtr()->IsKeyDown(DIK_LSHIFT) || g_Input.GetKeyPtr()->IsKeyDown(DIK_RSHIFT))
    {
        m_szCaption += char(ascii);
    }
    else
    {
        m_szCaption += char(ascii+32);
    }

    UpdateCursor();
}


// 将DirectInput扫描码转换成ASCII码
int CEditCTL::ScanToASCII(DWORD scancode)
{
   HKL layout = GetKeyboardLayout(0);
   unsigned char State[256];

   if (GetKeyboardState(State) == FALSE)    return 0;

   UINT vk = MapVirtualKeyEx(scancode, 1, layout);

   return vk;
}



我这个是要实现一个编辑框,接收用户输入的字符,然后渲染出来。
这样写会不会效率太低?应该是怎么写的?