确定WM_KEYDOWN的wParam是否可打印

时间:2014-04-19 10:46:39

标签: c++ winapi key ascii

我正试图在我的窗口的WM_KEYDOWN消息中检测到不可打印的字符,但到目前为止的研究没有产生任何结果。我尝试了以下方法:

  • 1:iscntrl(wParam),不适用于箭头键
  • 2:ischar(wParam),也不适用于相同的密钥
  • 3:ToAscii(wParam, MapVirtualKey(wParam, 0) ...),仍然无效

IMO第三种方法应该有效,因为箭头键不在任何ASCII或Unicode表上。

事情是我想向我的事件处理程序发送密钥和字符。由于WM_CHARWM_KEYDOWN之后发布,我想在WM_KEYDOWN中发送密钥,如果它不可打印(因为WM_CHAR不会被送到窗口,所以我不能在那里做。)

由于

2 个答案:

答案 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); 
}