diff --git a/Units/MMLCore/os_linux.pas b/Units/MMLCore/os_linux.pas index 59014e4..94bdeed 100644 --- a/Units/MMLCore/os_linux.pas +++ b/Units/MMLCore/os_linux.pas @@ -413,34 +413,40 @@ implementation result := xmask and ButtonP > 0; end; - procedure TWindow.SendString(str: string); - var - i: integer; - key: byte; - HoldShift : boolean; +procedure TWindow.SendString(str: string); +var + I, L: Integer; + K: Byte; + HoldShift: Boolean; +begin + HoldShift := False; + L := Length(str); + for I := 1 to L do begin - HoldShift := false; - for i := 1 to length(str) do + if (((str[I] >= 'A') and (str[I] <= 'Z')) or + ((str[I] >= '!') and (str[I] <= '&')) or + ((str[I] >= '(') and (str[I] <= '+')) or + (str[I] = ':') or + ((str[I] >= '<') and (str[I] <= '@')) or + ((str[I] >= '^') and (str[I] <= '_')) or + ((str[I] >= '{') and (str[I] <= '~'))) then begin - if((str[i] >= 'A') and (str[i] <= 'Z')) then - begin - HoldKey(VK_SHIFT); - HoldShift:= True; - str[i] := lowerCase(str[i]); - end else - if HoldShift then - begin - HoldShift:= false; - ReleaseKey(VK_SHIFT); - end; - key:= GetKeyCode(str[i]); - HoldKey(key); - //BenLand100: You should probably wait here... - ReleaseKey(key); + HoldKey(VK_SHIFT); + HoldShift := True; end; - if HoldShift then + + K := GetKeyCode(str[I]); + HoldKey(K); + Sleep(20); + ReleaseKey(K); + + if (HoldShift) then + begin + HoldShift := False; ReleaseKey(VK_SHIFT); + end; end; +end; procedure TWindow.HoldKey(key: integer); begin diff --git a/Units/MMLCore/os_windows.pas b/Units/MMLCore/os_windows.pas index 41a7e1a..6d6f77a 100644 --- a/Units/MMLCore/os_windows.pas +++ b/Units/MMLCore/os_windows.pas @@ -366,34 +366,34 @@ begin end; end; - procedure TWindow.SendString(str: string); - var - i: integer; - key: byte; - HoldShift : boolean; +procedure TWindow.SendString(str: string); +var + I, L: integer; + C: Byte; + ScanCode, VK: Word; + Shift: boolean; +begin + L := Length(str); + for I := 1 to L do begin - HoldShift := false; - for i := 1 to length(str) do - begin - if((str[i] >= 'A') and (str[i] <= 'Z')) then - begin - HoldKey(VK_SHIFT); - HoldShift:= True; - str[i] := lowerCase(str[i]); - end else - if HoldShift then - begin - HoldShift:= false; - ReleaseKey(VK_SHIFT); - end; - key:= GetKeyCode(str[i]); - HoldKey(key); - //BenLand100 note: probably should wait here - ReleaseKey(key); - end; - if HoldShift then - ReleaseKey(VK_SHIFT); + VK := VkKeyScan(str[I]); + Shift := (Hi(VK) > 0); + C := LoByte(VK); + ScanCode := MapVirtualKey(C, 0); + if (ScanCode = 0) then + Continue; + + if (Shift) then + Keybd_Event(VK_SHIFT, $2A, 0, 0); + + Keybd_Event(C, ScanCode, 0, 0); + Keybd_Event(C, ScanCode, KEYEVENTF_KEYUP, 0); + + if (Shift) then + Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0); end; +end; + procedure TWindow.HoldKey(key: integer); begin keyinput.Down(key);