我正试图在我的窗口的WM_KEYDOWN
消息中检测到不可打印的字符,但到目前为止的研究没有产生任何结果。我尝试了以下方法:
iscntrl(wParam)
,不适用于箭头键ischar(wParam)
,也不适用于相同的密钥ToAscii(wParam, MapVirtualKey(wParam, 0) ...)
,仍然无效IMO第三种方法应该有效,因为箭头键不在任何ASCII或Unicode表上。
事情是我想向我的事件处理程序发送密钥和字符。由于WM_CHAR
在 WM_KEYDOWN
之后发布,我想在WM_KEYDOWN
中发送密钥,如果它不可打印(因为WM_CHAR
不会被送到窗口,所以我不能在那里做。)
由于
答案 0 :(得分:0)
鉴于大多数通常被认为是"可打印"是连续的,为什么不只是使用一些 if 语句来决定你想如何处理它们?在WM_KEYDOWN中,确定某个键是否为"可打印"是否,如果是,请将其关闭到WM_CHAR。
您正在研究的功能并非针对此特定目的而设计,因此具有讽刺意味的是,您可能花费更多时间研究它们,而不是单独制作临时解决方案。
答案 1 :(得分:0)
您的方法3应该可以解决此问题。在PreTranslateMessage
中,处理WM_KEYDOWN
:
BYTE keyboardState[256];
::GetKeyboardState(keyboardState);
WORD ascii;
int len = ::ToAscii(wParam, (lParam >> 16) & 0xFF, keyboardState, &ascii, 0);
if (len == 1)
{
/* it's printable */
printf("%c", ascii & 0xFF);
}