Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Buchstaben an Internetexplorer senden (https://www.delphipraxis.net/193506-buchstaben-internetexplorer-senden.html)

Markus Effenberger 8. Aug 2017 11:27

Buchstaben an Internetexplorer senden
 
Hallo !

Mit dem folgenden Code möchte ich Tasten an einen Internetexplorer senden:

Delphi-Quellcode:
procedure SendeTaste(Empfaenger: THandle; Zeichencode: Integer);
begin
  PostMessage(Empfaenger, WM_KEYDOWN, Zeichencode,  0);
  PostMessage(Empfaenger, WM_KEYUP,  Zeichencode,  0);
end;

procedure SendeWortBuchstabenweise(Empfaenger: THandle; Text: string);
Var i:integer;
begin
  for i := 1 to length(Text) do
    begin
      SendeTaste(Empfaenger,Ord(Text[i]));
    end;
end;
Der Aufruf erfolgt mit:

Delphi-Quellcode:
z.B.: SendeWortBuchstabenweise(HANDLE,Edit1.Text);
z.B.: SendeTaste(HANDLE,VK_TAB);

Wenn man das Handle von einem Editorfenster übergibt, funktioniert alles tadellos.
Buchstaben, Tabulatoren, Leertasten, Entertasten... Alles kommt im Editor an.

Wenn man allerdings an einen TAB im aktuellen Internetexplorer in Windows 7 sendet,
so kommt nur die Tabulatortaste an. Oder es kommt die Leertaste an, wenn der Focus auf einem Button liegt.

Wenn der Focus auf einem Eingabefeld liegt, kommen keine Buchstaben im Eingabefeld an.
Hat jemand eine Idee, wie man Buchstaben an ein Internet-explorer-fenster senden kann? (Chrome oder Edge wäre auch noch ok. Wobei ich dazusagen muss, dass im Chrome oder Opera z.B. nicht einmal die Tabulatortasten ankommen.)


Gruß,
Markus Effenberger

blablab 8. Aug 2017 12:50

AW: Buchstaben an Internetexplorer senden
 
Wenn du nicht auf Delphi angewiesen bist würde ich sowas eher mit einer Skriptsprache wie zB AutoHotkeys machen.

Markus Effenberger 8. Aug 2017 13:13

AW: Buchstaben an Internetexplorer senden
 
Zitat:

Zitat von blablab (Beitrag 1378330)
Wenn du nicht auf Delphi angewiesen bist würde ich sowas eher mit einer Skriptsprache wie zB AutoHotkeys machen.

Geht leider nur in Delphi :(

Man könnte natürlich Globale Tastendrücke machen.
Delphi-Quellcode:
procedure SendGlobalKeyPress(KChar: Char);
var
  Scan: SHORT;
  key: Byte;
begin
    key := Byte(KChar);
    Scan := MapVirtualKey(key, 0);
    keybd_event(key, Scan, 0, 0); //Status: Gedrückt
    keybd_event(key, Scan, KEYEVENTF_KEYUP, 0); //Status: Normal
end;
Die funktionieren aber leider nur, wenn das Browserfenster den Focus hat.
Ich würde gerne Tastendrücke an Browserfenster senden, die sich im Hintergrund befinden.

.

Bernhard Geyer 8. Aug 2017 14:24

AW: Buchstaben an Internetexplorer senden
 
Was willst du eigentlich erreichen?
Dein Lösungsansatz kommt mit doch reichlich "da könnte es das eine oder ander Problem geben und mit dem nächsten Windows/IE-Update wird das alles nicht mehr funktionieren" an.

Wieso willst du Key an ein IE-Fenster senden?
Was soll damit erreicht werden?

Der schöne Günther 8. Aug 2017 14:29

AW: Buchstaben an Internetexplorer senden
 
Sein anderes Thema war
http://www.delphipraxis.net/193498-f...dows-10-a.html

Hier ging es darum ein Browser-Tab in den Vordergrund zu bringen und etwas vorzuführen.

Ich persönlich würde das auch niemals so machen, da hast du nie Sicherheit dass das nach dem nächsten Update noch funktioniert. Im Browser am Benutzer vorbei etwas eingeben könnte auch etwas sein wo vielleicht manche Virenscanner drauf anspringen.

Ich sehe in anderer Software so etwas (wenn man etwas "erklären" will) immer durch kurze Videoclips gelöst.

Delbor 8. Aug 2017 14:38

AW: Buchstaben an Internetexplorer senden
 
Hi zusammen

@ Bernhard Geyer Schaut so aus, als wolle er da Formularfelder ausfüllen.

Nun ja, da man Word und die andern Officeprogramme mit Delphi fernsteuern kann, liegt der Gedanke nahe, dies auch mit dem IE auszutesten.
Ansonsten würde es sich anbieten, die betreffende Webseite nicht im IE zu laden, sondern in TWebbrowser

Gruss
Delbor

madas 8. Aug 2017 14:46

AW: Buchstaben an Internetexplorer senden
 
Zitat:

Zitat von Markus Effenberger (Beitrag 1378335)
Zitat:

Zitat von blablab (Beitrag 1378330)
Wenn du nicht auf Delphi angewiesen bist würde ich sowas eher mit einer Skriptsprache wie zB AutoHotkeys machen.

Geht leider nur in Delphi :(

Man könnte natürlich Globale Tastendrücke machen.
Delphi-Quellcode:
procedure SendGlobalKeyPress(KChar: Char);
var
  Scan: SHORT;
  key: Byte;
begin
    key := Byte(KChar);
    Scan := MapVirtualKey(key, 0);
    keybd_event(key, Scan, 0, 0); //Status: Gedrückt
    keybd_event(key, Scan, KEYEVENTF_KEYUP, 0); //Status: Normal
end;
Die funktionieren aber leider nur, wenn das Browserfenster den Focus hat.
Ich würde gerne Tastendrücke an Browserfenster senden, die sich im Hintergrund befinden.

.

Schade für C# hättest Du WatiN benutzen können. Für automatisierte Test mit Formularausfüllung ist diese Framework sehr geeignet.

madas

nahpets 8. Aug 2017 14:48

AW: Buchstaben an Internetexplorer senden
 
Könntest Du statt des IEs auch den TWebBrowser innerhalb Deiner Anwandung nutzen?

Wenn ja, ließe sich die Eingabe programmintern lösen.

Weiß nicht mehr, wo ich das herhabe:
Delphi-Quellcode:
// ...HTML Formulare mit TWebBrowser automatisch ausfüllen lassen?
function WBFillForm(wb: TWebBrowser; sFieldName: string; sValue: string): Boolean;
var
  i, j: Integer;
  FormItem: Variant;
begin
  Result := False;
  //no form on document
  if wb.OleObject.Document.all.tags('FORM').Length = 0 then begin
    Exit;
  end;
  //count forms on document
  for I := 0 to wb.OleObject.Document.forms.Length - 1 do begin
    FormItem := wb.OleObject.Document.forms.Item(I);
    for j := 0 to FormItem.Length - 1 do begin
      try
        // when the fieldname is found, try to fill out
        if AnsiUpperCase(FormItem.Item(j).Name) = AnsiUpperCase(sFieldName) then begin
          FormItem.Item(j).Value := sValue;
          Result := True;
        end;
      except
        Exit;
      end;
    end;
  end;
end;
Ansonsten schau mal bitte hier: https://www.delphi-treff.de/tipps-tr...ern-ermitteln/

Dort ist beschrieben, wie Du an eine Instanz vom IE kommen kannst. Die bekommst Du dann als IWebbrowser2 (definiert in SHDocVw). Mit der so erhaltenen Instanz kannst Du dann alles machen, was die Schnittstelle zulässt.

Da der TWebBrowser in der gleichen Unit definiert ist, würde es mich wundern, wenn Du über einen so "gefundenen" IE nicht das Gleiche anstellen kannst, wie mit 'nem TWebBrowser.

Markus Effenberger 9. Aug 2017 07:23

AW: Buchstaben an Internetexplorer senden
 
Zitat:

Zitat von nahpets (Beitrag 1378347)
Könntest Du statt des IEs auch den TWebBrowser innerhalb Deiner Anwandung nutzen?

Nein leider nicht. Die TWebbrowserkomponente führt die Seite nicht richtig aus (z.B. keine Javascripts).

Der schöne Günther 9. Aug 2017 07:38

AW: Buchstaben an Internetexplorer senden
 
Nur als Hinweis: Der TWebBrowser kapselt standardmäßig einen uralten Internet Explorer 7. Du kannst ihn auch auf die jeweils neuste IE-Version einstellen, der kommt eigentlich mit allem klar.

http://www.delphipraxis.net/192748-i...ml#post1371666


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz