在Windows API和Direct2D/DirectWrite中,我正在检测虚拟代码,以便可以附加2D GUI中的文本输入。虽然它可以正常工作,但是如何包含非字母,例如!?等。如何使用Windows API中的虚拟代码检测非字母?
例如,当我按下Shift + 1时,我得到'1'而不是'!'。当我按'。'时,我得到一个盒装角色。该功能可以在某种程度上检查此检测吗?
wchar_t TextBox::charIsPressed(int getKey)
{
char letter = getKey;
// Check for space character
if (letter == ' ')
return (wchar_t)letter;
// Check if the input is no letter
if ((getKey >= 'A') && (getKey <= 'Z'))
{
if (!GetAsyncKeyState(VK_SHIFT))
letter += 0x20;
}
return (wchar_t)letter;
}
它调用的函数:
// Keyboard support
static X2D::Win32::KeyEvent *keyEvent;
if (m_focused)
{
// Check if there's editing space
if ((m_x + m_text.getWidth()) > (m_x + getWidth()))
return;
// Get the latest key event
keyEvent = frm.getKeyEvent();
if (!keyEvent->processed)
{
// Was backspace pressed?
if (keyEvent->virtual_code == VK_BACK)
{
m_text.setText(m_text.getText().substr(0, m_text.getText().length() - 1));
}
else if (keyEvent->virtual_code == VK_RETURN)
{
m_focused = false;
}
else
{
m_text.setText(m_text.getText() + charIsPressed(keyEvent->virtual_code));
}
keyEvent->processed = true;
}
}
编辑: 我发现用于检测单个字符的方式,所以它是一个开始。
// Converts '1' to '!'
if (getKey == '1')
{
if (GetAsyncKeyState(VK_SHIFT))
return '!';
}
虽然键入'。'让我变成一个半雪人Ascii的身影。
你为什么不让系统为你做繁重的任务?只需处理'WM_CHAR',一切正常。无需手动编写输入即可完成系统已为您执行的操作。 – IInspectable