Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Послать текст активному полю ввода текущего активного окна

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

Код:
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;
465
28 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Странное вы чтото делаете.
SendMessage посылает сообщение окну с оконной функцией. Наврядли у этого эдита в браузере есть таковая.
И наврядли у него вообще есть хендл. Обычно хендл единый для всех элементов, кроме активъиксов которые в свою очередь имеют свои хендлы.
Не могу помоч кодом, т.к. заполнял формы и нажимал кнопки в своей программе куда ставился компонент веббраузер.
Для доступа к элементам браузера нужно будет почитать про DOM и про интерфейсы.
465
28 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Кстати вот нашол код, там из под программы запускается IE(с другими браузерами не работал), может он вам будет полезен.

Код:
var
  Form1: TForm1;
  V: Variant;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
     V := CreateOleObject('InternetExplorer.Application');
     V.Toolbar := FALSE;
     V.Statusbar := FALSE;
     V.Left := (Screen.Width - 600) div 2;
     V.Width := 600;
     V.Top := (Screen.Height - 400) div 2;
     V.Height := 400;
     V.Visible := TRUE;
     V.Navigate(URL := 'file://C:\1.html');

end;



procedure TForm1.Button2Click(Sender: TObject);
begin
     V.Quit
end;



procedure TForm1.Button3Click(Sender: TObject);
var
Winds: IShellWindows;
IEWB: IWebBrowser2;
i: integer;
Doc: IHtmlDocument2;
begin
     Winds:=CoShellWindows.Create;
     for i:=0 to Winds.Count-1 do
     begin
          if (Winds.Item(i) as IWEbBrowser2).Document <> nil then
          begin
              IEWB:=Winds.Item(i) as IWEbBrowser2;
              if IEWB.Document.QueryInterface(IhtmlDocument2, Doc) = S_OK then
              begin
                   Memo1.Lines.Add(Doc.url);
              end;    
          end;
     end;

end;
Вот в третьей кнопке как пример доступа к выбдокументу. Вам нужно перемещаться по узлам пока вы не выйдете вам нужный.
Если вы с этим ни разу не сталкивались то по началу может показаться убийством мозга. :-)

Не стоит воспринимать этот код за чистую монету. Он может быть вообще не рабочим. Он только демонстрирует в какую сторону двигаться
330
28 ноября 2012 года
kastron
215 / / 17.09.2006
Спасибо! Буду разбираться... т.е. если я правильно понял насчет браузеров универсального подхода не существует? придется затачивать код под каждый конкретный браузер?
465
28 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Честно говоря не знаю, я эту тему не отслеживаю уже очень долго. Вы почитайте про поддержку DOM разными браузерами.
Вообще для работы браузера раньше не являлось необходимостью следовать стандартам W3C DOM. Встречались браузеры реализующие свою модель документа.
Но сейчас может быть ситуация поменялась.
465
28 ноября 2012 года
QWERYTY
595 / / 25.03.2012
И если вы в своей программе захотите идентифицировать с каким браузерным движком имеете дело то (если не ошибаюсь) вам нужно будет знать как он зарегистрирован в системе. То есть знать его ProgId или ClsId.

Если же функционал который вам нужен поддерживается всеми моделями документов всех браузеров с которыми вы будете иметь дело то наверно это нафиг не нужно(я про возню с ProgId и ClsId)
465
29 ноября 2012 года
QWERYTY
595 / / 25.03.2012
Вот ещё поковырялся в прпоектах. Заполнение форм для ввода логина и пароля в своей программе:

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
iDoc: IHtmlDocument2;
i: integer;
ov: OleVariant;
iDisp: IDispatch;
iColl: IHTMLElementCollection;
iInputElement: IHTMLInputElement;
begin
 WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2, iDoc);
  if not assigned(iDoc) then
  begin
    ShowMessage(' !!!??? Nothing dowloaded ... ');
    Exit;
  end;
  ov := 'INPUT';
  IDisp := iDoc.all.tags(ov);
  if assigned(IDisp) then
  begin
    IDisp.QueryInterface(IHTMLElementCollection, iColl);
    if assigned(iColl) then
    begin
      for i := 1 to iColl.Get_length do
      begin
        iDisp := iColl.item(pred(i), 0);
        iDisp.QueryInterface(IHTMLInputElement, iInputElement);
        if assigned(iInputElement) then
        begin
          if iInputElement.Get_name = 'login' then iInputElement.Set_value('????????');
          if iInputElement.Get_name = 'password' then iInputElement.Set_value('????????');
     //  if  iInputElement.Get_name = 'button' then



        end;
      end;
    end;
  end;
 
end;
К сожалению полноценного проекта нет. Всё опробовалось в разных, а собирать потом не стал за ненадобностью.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог