procedure TKeyInput.Press(StringValue: string);
var
i: integer;
needShiftKey: boolean = False;
keySym: word;
ch: char;
begin
i := 1;
while (i <= Length(StringValue)) do
begin
if StringValue[i] in ['A'..'Z', '~', '!', '@', '#', '$', '%', '^',
'&', '*', '(', ')', '_', '+', '{', '}', '|', ':', '"', '<', '>', '?'] then
needShiftKey := True;
ch := UpCase(StringValue[i]);
case ch of
'A'..'Z': keySym := VK_A + (Ord(ch) - Ord('A'));
'0'..'9': keySym := VK_0 + (Ord(ch) - Ord('0'));
'!': keySym := VK_1;
'@': keySym := VK_2;
'#': keySym := VK_3;
'$': keySym := VK_4;
'%': keySym := VK_5;
'^': keySym := VK_6;
'&': keySym := VK_7;
'*': keySym := VK_8;
'(': keySym := VK_9;
')': keySym := VK_0;
'~', '`': keySym := VK_LCL_TILDE;
'_', '-': keySym := VK_LCL_MINUS; //$2d;
'+', '=': keySym := VK_LCL_EQUAL; //$3d;
'{', '[': keySym := VK_LCL_OPEN_BRACKET; //$5b;
'}', ']': keySym := VK_LCL_CLOSE_BRACKET; //$5d;
'|', '\': keySym := VK_LCL_BACKSLASH; //$5c;
':', ';': keySym := VK_LCL_SEMI_COMMA; //$3b;
'"', '''': keySym := VK_LCL_QUOTE; //$27;
'<', ',': keySym := VK_LCL_COMMA; //$2c;
'>', '.': keySym := VK_LCL_POINT; //$2e;
'?', '/': keySym := VK_LCL_SLASH; //$2f;
#32: keySym := VK_SPACE;
#9: keySym := VK_TAB;
//Cannot handle Windows this way. Due to way windows needs a CR?
#10: keySym := VK_RETURN;
#13: keySym := VK_RETURN;
end;
if needShiftKey then Apply([ssShift]);
Press(keySym);
//if (needShiftKey) or (keySym = VK_RETURN) then // Testing something on Windows
if (needShiftKey) then
begin
Unapply([ssShift]);
needShiftKey := False;
end;
Inc(i);
end;
end;