Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定WM#U键是否向下';s wParam是可打印的_C++_Winapi_Key_Ascii - Fatal编程技术网

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)…)
    ,它仍然不起作用
在我看来,第三种方法应该有效,因为箭头键不在任何ASCII或Unicode表上

问题是,我想向我的事件处理程序发送keycode和字符。由于
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无法使用,因为对话框的控件处理关键消息,而对话框从未接收到它。