C++ 确定WM#U键是否向下';s wParam是可打印的
我试图在我的窗口的C++ 确定WM#U键是否向下';s wParam是可打印的,c++,winapi,key,ascii,C++,Winapi,Key,Ascii,我试图在我的窗口的WM_KEYDOWN消息中检测不可打印的字符,但到目前为止的研究还没有结果。我尝试过以下方法: 1:iscentrl(wParam),它不适用于箭头键 2:ischar(wParam),它也不适用于相同的键 3:ToAscii(wParam,MapVirtualKey(wParam,0)…),它仍然不起作用 在我看来,第三种方法应该有效,因为箭头键不在任何ASCII或Unicode表上 问题是,我想向我的事件处理程序发送keycode和字符。由于WM\u CHAR是在WM\
WM_KEYDOWN
消息中检测不可打印的字符,但到目前为止的研究还没有结果。我尝试过以下方法:
- 1:
,它不适用于箭头键iscentrl(wParam)
- 2:
,它也不适用于相同的键ischar(wParam)
- 3:
,它仍然不起作用ToAscii(wParam,MapVirtualKey(wParam,0)…)
WM\u CHAR
是在WM\u KEYDOWN
之后发布的,如果无法打印,我只想在WM\u KEYDOWN
中发送密钥(因为WM\u CHAR
不会发送到窗口,因此我无法在那里执行)
谢谢鉴于大多数通常被认为是“可打印”的键是连续的,为什么不使用几个if语句来决定如何处理它们呢?在WM_KEYDOWN中,确定某个键是否“可打印”,如果是,则将其激发到WM_CHAR 您正在研究的函数并不是为这个特定目的而设计的,因此具有讽刺意味的是,您可能会花更多的时间来研究它们,而不是自己制定一个特别的解决方案。您的方法3应该适用于此。在
PreTranslateMessage
中,处理WM\u 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);
}
MapVirtualKey()的参数错误,请改用MAPVK_VK_to_CHAR。不使用WM_CHAR是不明智的,没有什么是您无法在消息循环中修复的。有时WM_CHAR无法使用,因为对话框的控件处理关键消息,而对话框从未接收到它。