来自WM_CHAR的奇怪输入 - WinAPI

时间:2011-04-30 23:03:42

标签: c++ winapi unicode

这是我上一个问题的延续:WinAPI: How to process keyboard input in custom edit control 我觉得我应该把它放在一个不同的问题上,因为问题的性质有点不同。

所以我的程序现在正在接收输入,但输入有点偏。解释的最佳方式是向您展示代码和结果......

以下是处理WM_CHAR的代码:

    case WM_CHAR:
    {
        TCHAR inc;
        inc = MapVirtualKey(wParam, 2);

        for(short i = 0; i < sizeof(TCHAR); i++)
        {
            unsigned char* x = reinterpret_cast<unsigned char*>(&inc);
            printf("0x%.2X ", x[i]);
        }

        //InvalidateRect(t_hwnd, NULL, 0); // Repaint the window...

    }
    break;

程序编译为unicode,因此所有函数调用都默认为unicode变体。

以下是输入“asdf”的结果:

0x31 0x00 0x00 0x00 0x34 0x00 0x36 0x00
TCHAR的大小为2个字节,所以这就是“1 \ 046”

有人知道这笔交易是什么吗?

1 个答案:

答案 0 :(得分:1)

MapVirtualKey接受密钥的扫描代码。但是WM_CHAR中的wParam不是扫描码 - 它是一个字符。你应该使用WM_KEYDOWN,wParam有一个扫描码。

您的链接:

http://msdn.microsoft.com/en-us/library/ms646280(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/ms646276(v=vs.85).aspx