确定WM_KEYDOWN的 wParam 是否可打印

Determine whether WM_KEYDOWN's wParam is printable

本文关键字:是否 打印 wParam WM KEYDOWN 确定      更新时间:2023-10-16

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

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

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

问题是我想把键代码和字符都发送给我的事件处理程序。由于WM_CHAR发布在WM_KEYDOWN之后,如果无法打印,我只想在WM_KEYDOWN中发送密钥(因为WM_CHAR不会发送到窗口,所以我无法在那里执行)。

感谢

既然大多数通常被认为"可打印"的键都是连续的,为什么不使用一些if语句来决定如何处理它们呢?在WM_KEYDOWN中,决定密钥是否"可打印",如果是,则将其激发到WM_CHAR。

你正在研究的功能并不是为这个特定的目的而设计的,所以具有讽刺意味的是,你可能会花更多的时间来研究它们,而不是自己制定一个特别的解决方案。

您的方法#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); 
}