所以我正在使用 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/