Другие языки программирования и технологии

SendMessages передать окну строку

Пишу на делфи.
h := findwindow(nil, 'Приложение с окном ввода');
Приложение содержит только форму ввода текста
Как можно средствами WINAPI вставить текст в форму найденного окна?
Можно как нибудь в SendMessage передать?
Sergei Barskov
Sergei Barskov
487
Конечно, дикое извращение и позор, но когда-то, за неимением под рукой ничего лучше, я передавал текст в чужое окно WM_KEYDOWN-ами примерно так:

function LowByte(S :Char) :Byte;
begin
case S of
'Й' : Result := Ord('Q');
'Ц' : Result := Ord('W');
'У' : Result := Ord('E');
'К' : Result := Ord('R');
'Е' : Result := Ord('T');
'Н' : Result := Ord('Y');
'Г' : Result := Ord('U');
'Ш' : Result := Ord('I');
'Щ' : Result := Ord('O');
'З' : Result := Ord('P');
'Х' : Result := 219;
'Ъ' : Result := Ord(']');
'Ф' : Result := Ord('A');
'Ы' : Result := Ord('S');
'В' : Result := Ord('D');
'А' : Result := Ord('F');
'П' : Result := Ord('G');
'Р' : Result := Ord('H');
'О' : Result := Ord('J');
'Л' : Result := Ord('K');
'Д' : Result := Ord('L');
'Ж' : Result := Ord(';');
'Э' : Result := Ord('''');
'Я' : Result := Ord('Z');
'Ч' : Result := Ord('X');
'С' : Result := Ord('C');
'М' : Result := Ord('V');
'И' : Result := Ord('B');
'Т' : Result := Ord('N');
'Ь' : Result := Ord('M');
'Б' : Result := 188;
'Ю' : Result := Ord('.');
'.' : Result := 191;
' ' : Result := Ord(' ');
'0' : Result := Ord('0');
'1' : Result := Ord('1');
'2' : Result := Ord('2');
'3' : Result := Ord('3');
'4' : Result := Ord('4');
'5' : Result := Ord('5');
'6' : Result := Ord('6');
'7' : Result := Ord('7');
'8' : Result := Ord('8');
'9' : Result := Ord('9');
'-' : Result := 189;
#13 : Result := 13;
end;
end;

function HighByte(S :Char):Byte;
begin
case S of
'Й' : Result := 16;
'Ц' : Result := 17;
'У' : Result := 18;
'К' : Result := 19;
'Е' : Result := 20;
'Н' : Result := 21;
'Г' : Result := 22;
'Ш' : Result := 23;
'Щ' : Result := 24;
'З' : Result := 25;
'Х' : Result := 26;
'Ъ' : Result := 27;
'Ф' : Result := 30;
'Ы' : Result := 31;
'В' : Result := 32;
'А' : Result := 33;
'П' : Result := 34;
'Р' : Result := 35;
'О' : Result := 36;
'Л' : Result := 37;
'Д' : Result := 38;
'Ж' : Result := 39;
'Э' : Result := 40;
'Я' : Result := 44;
'Ч' : Result := 45;
'С' : Result := 46;
'М' : Result := 47;
'И' : Result := 48;
'Т' : Result := 49;
'Ь' : Result := 50;
'Б' : Result := 51;
'Ю' : Result := 52;
'.' : Result := 53;
' ' : Result := 57;
'0' : Result := 11;
'1' : Result := 2;
'2' : Result := 3;
'3' : Result := 4;
'4' : Result := 5;
'5' : Result := 6;
'6' : Result := 7;
'7' : Result := 8;
'8' : Result := 9;
'9' : Result := 10;
'-' : Result := 12;
#13 : Result := 28;
end;
end;

procedure SendString(H :THandle; S :String);
var j :Integer;
begin
for j := 1 to Length(S)
do begin
SendMessage(H,WM_KEYDOWN,LowByte(S[j]),1+HighByte(S[j]) shl 16);
end;
end;
Антон К.
Антон К.
24 825
Лучший ответ
Sergei Barskov Спасибо за ответ. Я сначала также сделал, но работает не корректно. Потом сделал Control + V через буфер обмена, но это требует модуля Ctrlb и увеличивает размер программы на 400 кб.
Теперь разобрался, сделал так:
program Project2;
uses
Windows,Messages,Dialogs;
{$R *.res}
var
h: HWND;
s: pchar;
EditControl : HWND;
begin
s := 'fynbdbhecj,jchfkcz';
h := FindWindow(nil,'Ââîä ïàðîëÿ');
if h <> 0 then
begin
EditControl := FindWindowEx(h, 0, 'Edit', nil);
SendMessage(EditControl, WM_SETTEXT, 0, integer(s));
PostMessage(h, WM_KEYDOWN, VK_RETURN, 1);
PostMessage(h, WM_KEYUP, VK_RETURN, 1);
end;
end.
Размер проги - 15кб.
Для определения класса контролов использовал программу WindowScanner