Entwickler-Ecke

Internet / Netzwerk - Edit-Felder im Internet Explorer von Delphi aus füllen


Jörk Finkel - So 14.07.02 20:52
Titel: Edit-Felder im Internet Explorer von Delphi aus füllen
Aloha zusammen.

Nachdem ich dieses Thema nun schon in einigen Foren gesteckt habe, mir aber bisher keiner helfen konnte, will ich es hier versuchen!

Ich hab einen WebSpace Anbieter wo ich meine HP hochladen will. Dieser erlaubt jedoch immer nur ein File zu uppen. Da meine HP aber einige Files umfasst und ich gerne Code, will ich dies automatisieren.

Auf dieser Seite gibt es eine EditBox vom Type=File (Name=file) wo mann entweder durch Klicken des Buttons DURCHSUCHEN ein File angeben kann, oder es manuel in die TextBox eingibt.

Mir will es aber pertu nicht gelingen über Delphi diesen FileNamen zu übergeben.

Folgendes hab ich versucht:Webbrowser1.OleObject.Document.Forms.item(0).elements.item('file').Value:='c:\config.sys';

Hier Passiert rein garnichts! Auch keine Fehlermeldung von Delphi. Ich weiss das ich die TextBox korrekt angesprochen habe. Da diese aber keine VALUE-Eigenschaft hat wird auch wohl nichts eingetragen.

Was anderes:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button3Click(Sender: TObject);
var
i: Integer;
EncodedStr: string;
Header: OleVariant;
Post: OleVariant;
begin
EncodedStr := 'file=c:\autoexec.bat';
The post must be an array. But without null terminator (-1)
Post := VarArrayCreate([0, Length(EncodedStr) - 1], varByte);
Put Post in array
for I := 1 to Length(EncodedStr) do
Post[I - 1] := Ord(EncodedStr[I]);
Header := 'Content-Type: application/x-www-form-urlencoded' + #10#13;
WebBrowser1.Navigate('http://de.groups.yahoo.com/group/ognd-m1cd-0/sfupld/ognd-m1cd-0?',
EmptyParam,
EmptyParam, Post, Header);


Hier wird ein Formular an den Server geschickt mit einer URL wie sie eventuell auch von der besagten HTML vom Browser an den Server geschickt wird. Aber hier gibt es nur eine Fehlermeldung vom Server das das File nicht grösser als 5 MB sein darf. Das die Autoexec.bat diese Grösse nicht erreicht muss ich wohl nicht schreiben ;)

Mir selbst Fällt nichts mehr ein wie ich dem Server klar machen kann wie der Filename lautet.

Vieleicht hat ja einer von Euch eine Lösung.
Hier die beschriebene Problem-HTML:
http://mitglied.lycos.de/otheriddlero/Problem.htm

Code-Tags eingefügt. Marc
Titel lt. Richtlinien geändert. Marc


Chatfix - Di 16.07.02 15:46

ich hätte mir mal nen ordentlichen titel gekauft..
Zum Thema selbst fällt mir spontan nix ein.. ich gugg mal was ich tun kann


subTiTan - So 05.01.03 13:14
Titel: Schon mit WinApi versucht?
Versuch es mal über die Winapi, ist zwar nicht besonders dynamisch, aber wenn es nur um diese eine Seite geht, sollte das ja egal sein.
Ich habe vor längerem mal ein ähnliches Problem gehabt, nur musste ich die Felder einer DatenbankAnwendung ausfüllen und nicht im Iexplorer.
Ich stelle mir das so vor:
Shellexecute( iexplore: DeineURL)
- GetHandle (iexplorer)
- sendmessage(Tabulator,HandleIexplorer) bis du das Feld findest
-sendmessage(Pfad,HandleIexplorer) //Pfad eingeben
-sendmessage(Enter,Handleiexplorer) //Enter schicken

Das ist der Code zum meiner WinApi-Applikation, du findest noch mehr info zur Winapi in der MSSDKoder im Forum.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
function GetFocusEx(): HWND;
var  FgWnd: HWND;  FgTid: DWORD;  Tid: DWORD;
begin
Result := 0;
FgWnd := GetForegroundWindow();
FgTid := GetWindowThreadProcessId(FgWnd, nil);
Tid := GetCurrentThreadId();
if (FgTid = Tid) then
Result := GetFocus()
else
if AttachThreadInput(Tid, FgTid, True)
then
begin
Result := GetFocus();
AttachThreadInput(Tid, FgTid, False);
end;
end;

function send1key(Thread:HWND;Key1:Byte):boolean;
begin
SetForeGroundWindow(Thread);
keybd_event(Key1,MapVirtualKey(Key1,0),0,0);
keybd_event(Key1,MapVirtualKey(Key1,0),KEYEVENTF_KEYUP,0);
end;


function SendStr2Handle(Thread:HWND;Text:String):boolean;
begin
SendMessage(Thread,WM_SETTEXT,0,lParam(PChar(Text)));
result:=true;
end;

function send2keys(Thread:HWND;Key1:Byte;Key2:Byte):boolean;
var
vk1,vk2:UINT;
begin
SetForeGroundWindow(Thread);
vk1:=MapVirtualKey(Key1,0);
vk2:=MapvirtualKey(Key2,0);
keybd_event(Key1,vk1,0,0);
keybd_event(Key2,vk2,0,0);
keybd_event(Key1,vk1,KEYEVENTF_KEYUP,0);
keybd_event(Key2,vk2,KEYEVENTF_KEYUP,0);
result:=true;
end;


Mit GetfocusEx bekommst du den Handle des Aktiven Fensters, es gibt auch einen anderen weg an den Handle zu kommen, über den Namen des Prozesses, aber das habe ich vergessen, schau mal im Forum nach.
Oder noch besser: Shellexecute liefert den Handle, wenn ich mich recht erinnere.

Good Luck
subTiTan