Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > послать текст активному полю ввода текущего активн


Автор: kastron 28.11.2012, 18:40
Здравствуйте! Есть задача: послать текст активному полю ввода текущего активного окна, т.е. тому элементу на котором сейчас находится курсор. Ниже привожу код, который это делает, но есть одна проблема. Не работает в браузерах... Как решить эту проблему? Спасибо.

Код

var
  h:hwnd;
  PID:dword;
  lpgui: tagGUITHREADINFO;
  hCaret:HWND;
  txt:string;
begin
  txt:='TEXT';
  h:=GetForegroundWindow;
  PID:=GetWindowThreadProcessId(h);
  lpgui.cbSize:=sizeof(tagGUITHREADINFO);
  GetGUIThreadInfo(PID, lpgui);
  hCaret:=lpgui.hwndCaret;
  SendMessage(hCaret,WM_SETTEXT,0,DWORD(PChar(txt)));
end;

Автор: kami 29.11.2012, 07:57
Один из вариантов, нужный текст "набирается клавиатурой" в активном поле ввода, делалось 3 года назад в качестве разминки, в D7. Под юникодные версии Delphi не адаптировалось, не было необходимости.
Код

function TForm1.GetVKCode(Ch: Char): Word;
begin
  Result := VkKeyScanEx(Ch, GetKeyboardLayout(0));
  if Result = High(Word) then
    begin
      Beep;
      Memo1.Text := 'Error';
      Caption:=Ch;
    end;
end;
//=============================================
var
  ch: Char;
  Input: TInput;
  IsUpperCase: boolean;
begin
  for i:=1 to Length(FBuf) do // FBuf - строка, которую нужно набрать.
    begin
      ch := FBuf[i];

      IsUpperCase := HiByte(GetVKCode(Ch)) <> 0;

      Input.Itype := INPUT_KEYBOARD;
      Input.ki.dwFlags := 0;
      Input.ki.time := 0;
      Input.ki.dwExtraInfo := 0;

      if isUpperCase then
        begin
          Input.ki.wVk := VK_SHIFT;
          SendInput(1, Input, SizeOf(TInput));
          //Sleep(20);
        end;

      Input.ki.wVk := LoByte(GetVKCode(ch));
      SendInput(1, Input, SizeOf(TInput));
      Sleep(10);

      Input.ki.dwFlags := KEYEVENTF_KEYUP;
      SendInput(1, Input, SizeOf(TInput));
      Sleep(10);

      if isUpperCase then
        begin
          Input.ki.wVk := VK_SHIFT;
          SendInput(1, Input, SizeOf(TInput));
          //Sleep(20);
        end;
      inc(FBufPos);
  end;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)