如何检索按下的键并更新编辑

时间:2018-04-08 10:27:46

标签: winapi

我有一个编辑,当用户按下SHIFT并且没有按下SHIFT中的大写时,我想让caracter小写(所以与当前行为相反)。

我做了以下代码,但我在堆栈上如何用按下的键更新Edit。

有什么帮助吗?

这是我的windowProc的一部分

case WM_CHAR:
    {
        if (HIWORD(wParam) == EN_UPDATE)
        {
            if (ED_FLT_CODE == LOWORD(wParam))
            {
                if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000)
                {                       
                    MessageBox(0, "shift", "", 0);
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

如果我们想要修改标准编辑控件的行为 - 我们需要的全部 - 将窗口过程子类化为WM_CHAR消息,替换wParam密钥的字符代码)在调用默认窗口程序进行编辑之前,使用大写(反转)。我们不需要任何GetKeyStateEN_UPDATE

例如:

LRESULT CALLBACK SubEditWindowProc(HWND hWnd,
                                 UINT uMsg,
                                 WPARAM wParam,
                                 LPARAM lParam,
                                 UINT_PTR uIdSubclass,
                                 DWORD_PTR /*dwRefData*/
                                 )
{
    switch (uMsg)
    {
    case WM_CHAR:
        if (IsCharLowerW((WCHAR)wParam))
        {
            CharUpperBuffW((PWSTR)&wParam, 1);
        }
        else if (IsCharUpperW((WCHAR)wParam))
        {
            CharLowerBuffW((PWSTR)&wParam, 1);
        }
        break;
    case WM_NCDESTROY:
        RemoveWindowSubclass(hWnd, SubEditWindowProc, uIdSubclass);
        break;
    }

    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}
对于某些语言,

可能会CharUpperBuffCharLowerBuff需要使用LCMapString[Ex],但对于大多数语言而言CharUpperBuffCharLowerBuff就足够了