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;
Послать текст активному полю ввода текущего активного окна
Здравствуйте! Есть задача: послать текст активному полю ввода текущего активного окна, т.е. тому элементу на котором сейчас находится курсор. Ниже привожу код, который это делает, но есть одна проблема. Не работает в браузерах... Как решить эту проблему? Спасибо.
SendMessage посылает сообщение окну с оконной функцией. Наврядли у этого эдита в браузере есть таковая.
И наврядли у него вообще есть хендл. Обычно хендл единый для всех элементов, кроме активъиксов которые в свою очередь имеют свои хендлы.
Не могу помоч кодом, т.к. заполнял формы и нажимал кнопки в своей программе куда ставился компонент веббраузер.
Для доступа к элементам браузера нужно будет почитать про DOM и про интерфейсы.
Код:
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;
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;
Если вы с этим ни разу не сталкивались то по началу может показаться убийством мозга. :-)
Не стоит воспринимать этот код за чистую монету. Он может быть вообще не рабочим. Он только демонстрирует в какую сторону двигаться
Спасибо! Буду разбираться... т.е. если я правильно понял насчет браузеров универсального подхода не существует? придется затачивать код под каждый конкретный браузер?
Вообще для работы браузера раньше не являлось необходимостью следовать стандартам W3C DOM. Встречались браузеры реализующие свою модель документа.
Но сейчас может быть ситуация поменялась.
Если же функционал который вам нужен поддерживается всеми моделями документов всех браузеров с которыми вы будете иметь дело то наверно это нафиг не нужно(я про возню с ProgId и ClsId)
Код:
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;
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;