2017-01-03 8 views
1

Моя проблема следующая процедура, которая показывает эту строку 'a-bb-ccc-dddd' в outpot как это 'a-b-c-d'. Как я могу это исправить.Повторяющиеся charachters, использующие send input в delphi

procedure SendText(const Value: WideString); 
var 
    i: Integer; 
    S: WideString; 
    TI, TYY222: TInput; 
    ki: TKeybdInput; 
    MyWND: HWND; 
const 
    KEYEVENTF_UNICODE = $0004; 
begin 
    S := (Value); 
    TI.Itype := INPUT_KEYBOARD; 
    for i := 1 to Length(S) do 
    begin 
    ki.wVk := 0; 
    ki.dwFlags := KEYEVENTF_UNICODE; 
    ki.wScan := Ord(S[i]); 
    TI.ki := ki; 
    SendInput(1, TI, SizeOf(TI)); 
    end; 
end; 

ответ

4

Неизменно ошибкой называть SendInput несколько раз в цикле таким образом. Вся точка SendInput заключается в том, что она выпускает ряд связанных событий ввода и отправляет их как атомную группу. Это прямо указано в документации для SendInput, и я рекомендую вам перечитать это.

Первое, что нужно изменить, так это использовать ваш цикл для построения массива входных событий и отправить этот массив целиком с помощью одного вызова SendInput, сделанного после завершения цикла.

Другая проблема заключается в том, что ваш код в настоящее время подделывает события нажатия клавиш, но не позволяет подделать события блокировки. Каждый персонаж, который вы вводите, включает в себя нажатие клавиши, а затем возврат. Таким образом, ваш массив должен иметь размер, чтобы содержать в два раза больше элементов, чем символы в строке. И для каждого персонажа вам нужно включить ключ и клавишу вверх. Включите KEYEVENTF_KEYUP в dwFlags, чтобы указать событие активации ключа.

Еще одна проблема, которую я вижу, заключается в том, что вы работаете с неинициализированными переменными. Вы установили некоторые, но не все поля ki. Вы должны убедиться, что вся запись инициализирована.

Кажется, у вас нет причин сделать копию входной строки. Вы можете напрямую работать со строкой ввода. Из копии нет ничего, что можно было бы сделать.

И, наконец, вы рассматривали возможность использования UI Automation вместо подделки ввода?

+0

Спасибо, да, я использовал UI Automation. Я нахожу этот образец [link] (http://stackoverflow.com/questions/25823685/sendinput-not-working-in-certain-apps-windows-with-delphi), но он не знает, почему это работает dos'nt для меня –

+2

Я немного удивляюсь, что вы делаете ту же самую ошибку, что и задал этот вопрос, и что вы игнорируете код из ответа. –

+0

Это потому, что перед тем, как я спрошу этот вопрос, вы проверили свой ответ на этот вопрос. Но я получил несколько ошибок. Вы уверены, что ваш ответ dos'nt имеет какую-либо ошибку в этом вопросе? –