2017-07-16 37 views
0

在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的身影。

+0

你为什么不让系统为你做繁重的任务?只需处理'WM_CHAR',一切正常。无需手动编写输入即可完成系统已为您执行的操作。 – IInspectable

回答

0

尝试是这样的(这是德尔福,但它可以让你看到翻译的原则):

function VKToChar(AVirtualCode: Word; out AChar: WideChar): Boolean; 
var 
    KeyboardState: TKeyboardState; 
    ScanCode: DWORD; 
    Temp: UnicodeString; 
    Char: WideChar; 
begin 
    AChar := #0; 
    Result := GetKeyboardState(KeyboardState); 
    if not Result then Exit; 
    ScanCode := MapVirtualKey(AVirtualCode, MAPVK_VK_TO_VSC); 
    SetLength(Temp, 3); 
    if ToUnicode(AVirtualCode, ScanCode, KeyboardState, PWideChar(Temp), Length(Temp), 0) = 1 then 
    begin 
     AChar := Temp[1]; 
     Result := True; 
    end 
    else 
    Result := False; 
end; 
+1

GetKeyboardState肯定与GetAsyncKeyState不兼容。 *应用程序可以调用此函数来检索所有虚拟键的当前状态。状态随着线程从其消息队列中移除键盘消息而改变。当键盘消息被发布到线程的消息队列时,状态不会改变,也不会随着键盘消息发布到其他线程的消息队列或从其中检索到它而改变。* –

相关问题