Hallo,
ich arbeite jetzt bei einer Internetagentur als Suchmaschinenoptimierer.
Wir haben ein Content Management System mit Adressmodul (Web-Formular).
Ich möchte mit Delphi 5 eine Anwendung schreiben, die unter Vorgabe eines bestimmten Textes, dass Web-Flormular automatisch ausfüllt.
Nachfolgend der Code von dem Programmfenster, welches die Auswahl des Zielfensters regelt:
Das ist die Prozedur die das Formular ausfüllen soll:
Unter Windows 7 (mein Laptop) tut das ding perfekt.
Unter Vista und XP nicht.
nicht funktionieren bedeutet bei dem einen PC, dass der Text gar nicht im Adressmodul(=Formular) landet.
Beim anderen PC füllt er die Eingabefelder korrekt aus, bis eine google-maps karte kommt und danach landen die texte nicht mehr in den richtigen Eingabefeldern.
Wer hat eine Idee wie ich das Problem löse?
Herzliche Grüße
Markus Lemcke
ich arbeite jetzt bei einer Internetagentur als Suchmaschinenoptimierer.
Wir haben ein Content Management System mit Adressmodul (Web-Formular).
Ich möchte mit Delphi 5 eine Anwendung schreiben, die unter Vorgabe eines bestimmten Textes, dass Web-Flormular automatisch ausfüllt.
Nachfolgend der Code von dem Programmfenster, welches die Auswahl des Zielfensters regelt:
Code:
procedure TTask.LstFensterClick(Sender: TObject); begin anwendung := LstFenster.Items[LstFenster.itemindex]; WindowHandlesave := strtoint(TempList.strings[LstFenster.itemindex]); end; procedure TTask.FormShow(Sender: TObject); begin TempList := TStringList.create; LstFenster.Clear; EnumWindows(@EnumWindProc,0); end; procedure TTask.BtnCancelClick(Sender: TObject); begin canclose1 := true; close; end; procedure TTask.btnokClick(Sender: TObject); var i : integer; begin i := LstFenster.ItemIndex; if i <> -1 then begin WindowHandlesave := StrToInt(TempList[i]); close; end else begin raise exception.create('Es wurde kein Fenster ausgewählt'); end; end; procedure TTask.FormClose(Sender: TObject; var Action: TCloseAction); begin TempList.destroy; end;
Code:
procedure TFrmMain.TextSenden; (* function ForceForegroundWindow(hWnd: THandle): BOOL; var hCurWnd: THandle; begin hCurWnd := GetForegroundWindow; AttachThreadInput(GetWindowThreadProcessId(hCurWnd, nil), GetCurrentThreadId, True); Result := SetForegroundWindow(hWnd); AttachThreadInput(GetWindowThreadProcessId(hCurWnd, nil), GetCurrentThreadId, False); end; *) function ForceForegroundWindow(hwnd: THandle): Boolean; const SPI_GETFOREGROUNDLOCKTIMEOUT = $2000; SPI_SETFOREGROUNDLOCKTIMEOUT = $2001; var ForegroundThreadID: DWORD; ThisThreadID: DWORD; timeout: DWORD; begin if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE); if GetForegroundWindow = hwnd then Result := True else begin // Windows 98/2000 doesn't want to foreground a window when some other // window has keyboard focus if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)))) then begin // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm // Converted to Delphi by Ray Lischner // Published in The Delphi Magazine 55, page 16 Result := False; ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil); ThisThreadID := GetWindowThreadPRocessId(hwnd, nil); if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then begin BringWindowToTop(hwnd); // IE 5.5 related hack SetForegroundWindow(hwnd); AttachThreadInput(ThisThreadID, ForegroundThreadID, False); Result := (GetForegroundWindow = hwnd); end; if not Result then begin // Code by Daniel P. Stasinski SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0), SPIF_SENDCHANGE); BringWindowToTop(hwnd); // IE 5.5 related hack SetForegroundWindow(hWnd); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE); end; end else begin BringWindowToTop(hwnd); // IE 5.5 related hack SetForegroundWindow(hwnd); end; Result := (GetForegroundWindow = hwnd); end; end; { ForceForegroundWindow } var text1,vZeile,Restort : string; z,k: integer; begin Restort := ''; vZeile := ''; text1 := MmoText.lines[0]; if length(text1) = 0 then text1 := ' '; if text1[1] = ' ' then system.delete(text1,1,1); if length(text1) < 7 then text1 := text1 + ' '; ForceForegroundWindow(WindowHandlesave); //For-Schleife durchläuft Memofeld und sendet den Inhalt zeilenweise an ein Web-Formular For z := 0 to MmoText.lines.count-1 do begin vZeile := MmoText.lines[z]; vZeile := StringReplace(vZeile,'+49','0',[]); if z+1 = StrToInt(CbxPlZ.Text) then begin //Wenn in der Zeile 2 Elemente mit Leerzeilen getrennt sind, dann PLZ und Ort if strelementcount(vZeile, ' ') >= 1 then begin SendKeys(pchar(strnelement(vZeile,' ',1)),true); sendkeys('{TAB}' ,true); Restort := Loeschestring(vZeile,strnelement(vZeile,' ',1)); //ShowMessage(Restort); SendKeys(pchar(Restort),true); sendkeys('{TAB}' ,true); Continue; end; end; //Inhalt der Adresszeile ins Eingabefeld schreiben SendKeys(pchar(vZeile),true); //Per Tabulatortaste ins nächste Eingabefeld sendkeys('{TAB}' ,true); //Karte überspringen if z = 7 then begin for k := 0 to strtoint(cbxkarte.text) do sendkeys('{TAB}' ,true); end; end; application.bringtofront; ForceForegroundWindow(application.handle); end;
Unter Vista und XP nicht.
nicht funktionieren bedeutet bei dem einen PC, dass der Text gar nicht im Adressmodul(=Formular) landet.
Beim anderen PC füllt er die Eingabefelder korrekt aus, bis eine google-maps karte kommt und danach landen die texte nicht mehr in den richtigen Eingabefeldern.
Wer hat eine Idee wie ich das Problem löse?
Herzliche Grüße
Markus Lemcke
Comment