c++ - WinAPI:如何在自定义编辑控件中处理键盘输入

标签 c++ winapi controls

所以我正在使用 Windows API 在 C++ 中创建自己的编辑控件(多行文本框)。一切进展顺利,但我对一件事有点困惑。

首先,该控件正在构建为能够处理 unicode,并且所有输入都将转换为 unicode。换句话说,所有输入都将存储为 wchar_t。

我感到困惑的是要处理键盘输入的消息。 MSDN 有以下窗口通知:

WM_CHAR
WM_KEYDOWN
WM_UNICHAR

还有其他,但我相信这是我需要处理的这三个之一。我的猜测是 WM_UNICHAR,但文档对此有点不清楚。另外,在查看 VKcodes 时,我看到了这个:

VK_PACKET
0xE7
Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP.

抱歉,如果这是一个愚蠢的问题,但我只是想确定一下。

最佳答案

如果您的控件被创建为 unicode 窗口(使用 CreateWindowW),则 在 WM_CHAR 中,您将得到开箱即用的宽字符。

如果您想提供控件的非 unicode 版本,那么您需要处理 WM_INPUTLANGCHANGE,类似这样:

case WM_INPUTLANGCHANGE:
{
              HKL NewInputLocale = (HKL) lParam ;
              g_InputCodePage = LangToCodePage( LOWORD(NewInputLocale) ) ; 
}

因此您的 WM_CHAR 处理程序应如下所示:

 case WM_CHAR:
     {
        unsigned char c = (byte)wParam;
        if(!::IsWindowUnicode(hwnd))
          MultiByteToWideChar(g_InputCodePage , 0, (LPCSTR) &c, 1, (LPWSTR) &wParam, 1) ;
     }

不要忘记 WM_IME_CHAR 和 friend 。 还有 RTL 输入。

关于c++ - WinAPI:如何在自定义编辑控件中处理键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5844689/

相关文章:

c++ - 有没有办法将 nth_element 与数据拷贝一起执行?

c++ - 如何将模型传递到 qml 中的播放列表?

c++ - 如何在 64 位 Windows 7 上使用 cygwin 从 C++ 生成 Java VM?

c++ - 在 Win32 API 中禁用组合框项

winapi - 在线程持续时间内更改光标

c# - 捕捉文本框滚动事件?

使用递归回溯的 C++ 数独求解器不起作用

c# - 如何在另一个窗口上设置窗口?

delphi - Delphi有 'joystick'控件吗?

c++ - 防止 C++ 中的类继承