Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Text in Eingabefeld beliebiger Anwendungen ersetzen? (https://www.delphipraxis.net/39922-text-eingabefeld-beliebiger-anwendungen-ersetzen.html)

toms 11. Feb 2005 08:37

Re: Text in Eingabefeld beliebiger Anwendungen ersetzen?
 
Zitat:

"_WwG" (Word XP)
"TEditControl" (Delphi2005, Code)
"Internet Exploerer_Server" (IE)
Dort wird es mit WM_GETTEXT auch nicht funktionieren.
Da diese Controls die WM_GETTEXT nicht verarbeiten.

FriFra 11. Feb 2005 08:40

Re: Text in Eingabefeld beliebiger Anwendungen ersetzen?
 
@toms: Das war mir schon klar... nur wie komme ich nun an den Text dieser Controls?

toms 11. Feb 2005 08:41

Re: Text in Eingabefeld beliebiger Anwendungen ersetzen?
 
Schaue mal im SDC. Dort hat's Beispiele dafuer.

FriFra 11. Feb 2005 09:07

Re: Text in Eingabefeld beliebiger Anwendungen ersetzen?
 
@toms: SDC??

Ich hab jetzt mal meinen Code etwas erweitert... jetzt blinken die betreffenden Controls ;) (ausser beim IE, dort blinkt das gesamte Fenster und nicht nur das aktive Control) ... mehr bekomme ich im Moment damit allerdings nicht gebacken
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  AppHWnd: HWND;
  ThreadId: DWORD;
  FocusHWnd: HWND;
  ClassName: string;
  S0, S1: string;
  Rect: TRect;
  Canvas: TCanvas;
  Loop: integer;
begin
  Timer1.Enabled := False;
  FocusHWnd := GetFocus;
  if not IsWindow(FocusHWnd) then
  begin
    AppHWnd := GetForegroundWindow;
    if AppHWnd <> Self.Handle then
    begin
      ThreadId := GetWindowThreadProcessId(AppHWnd, nil);
      if ThreadId <> 0 then
        if AttachThreadInput(GetCurrentThreadId, ThreadId, True) then
        begin
          FocusHWnd := GetFocus;
          AttachThreadInput(GetCurrentThreadId, ThreadId, False);

          SetLength(ClassName, 512);
          SetLength(ClassName, GetClassName(FocusHWnd, PChar(ClassName),
            Length(ClassName)));

          SetLength(S0, SendMessage(FocusHWnd, WM_GETTEXTLENGTH, 0, 0) + 1);
          if Length(S0) > 1 then
          begin
            Application.ProcessMessages;
            SetLength(S0, SendMessage(FocusHWnd, WM_GETTEXT, Length(S0),
              LPARAM(PChar(S0))));
            S1 := StringReplace(S0, '###Hierhin###', 'Neuer Text',
              [rfReplaceAll]);
            if S0 <> S1 then
              SendMessage(FocusHWnd, WM_SETTEXT, Length(S1), LPARAM(PChar(S1)));
          end
          else
          begin
            //Get editor co-ordinates
            Windows.GetClientRect(FocusHWnd, Rect);
            //Change width/height to be right/bottom
            Rect.BottomRight := Point(Rect.Left + Rect.Right, Rect.Top +
              Rect.Bottom);
            //Turn client-relative co-ordinates into screen-relative co-ordinates
            Windows.ClientToScreen(FocusHWnd, Rect.TopLeft);
            Windows.ClientToScreen(FocusHWnd, Rect.BottomRight);
            //Set up canvas for whole desktop and flash the editor a few times
            Canvas := TCanvas.Create;
            try
              Canvas.Pen.Mode := pmNot;
              Canvas.Pen.Width := 5;
              Canvas.Handle := GetDC(HWnd_Desktop);
              try
                for Loop := 1 to 8 do
                begin
                  Canvas.Polyline([Rect.TopLeft, Point(Rect.Right, Rect.Top),
                    Rect.BottomRight, Point(Rect.Left, Rect.Bottom),
                      Rect.TopLeft]);
                  Sleep(100);
                end
              finally
                ReleaseDC(HWnd_Desktop, Canvas.Handle)
              end;
            finally
              Canvas.Free
            end;
          end;
        end;
    end;
  end;

  if (ListView1.Items.Count = 0) or (ListView1.Items[ListView1.Items.Count -
    1].Caption <> IntToStr(FocusHWnd) + '[' + ClassName + ']="' + Trim(S0) + '"')
      then
  begin
    ListView1.Items.BeginUpdate;
    ListView1.Items.Add;
    ListView1.Items[ListView1.Items.Count - 1].Caption := IntToStr(FocusHWnd) +
      '[' + ClassName + ']="' + Trim(S0) + '"';
    ListView1.Items[ListView1.Items.Count - 1].MakeVisible(False);
    ListView1.Items.EndUpdate;
  end;
  Timer1.Enabled := True;
end;

Sprint 11. Feb 2005 09:08

Re: Text in Eingabefeld beliebiger Anwendungen ersetzen?
 
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
const
  S_SEARCH = '###Hierhin###';
  S_REPLACE = 'Neuer Text';
var
  AppHWnd: HWND;
  ThreadId: DWORD;
  FocusHWnd: HWND;
  ClsName: String;
  WndText: String;
begin

  AppHWnd := GetForegroundWindow;
  if IsWindow(AppHWnd) then
  begin
    if AppHWnd <> Self.Handle then
    begin
      ThreadId := GetWindowThreadProcessId(AppHWnd, nil);
      if ThreadId <> 0 then
        if AttachThreadInput(GetCurrentThreadId, ThreadId, True) then
        begin
          FocusHWnd := GetFocus;
          AttachThreadInput(GetCurrentThreadId, ThreadId, False);
        end;
    end else
      FocusHWnd := GetFocus;
    if IsWindow(FocusHWnd) then
    begin
      SetLength(ClsName, 512);
      SetLength(ClsName, GetClassName(FocusHWnd, PChar(ClsName), Length(ClsName)));
      SetLength(WndText, SendMessage(FocusHWnd, WM_GETTEXTLENGTH, 0, 0) + 1);
      SetLength(WndText, SendMessage(FocusHWnd, WM_GETTEXT, Length(WndText), LPARAM(PChar(WndText))));
      if Pos(S_SEARCH, WndText) > 0 then
      begin
        WndText := StringReplace(WndText, S_SEARCH, S_REPLACE, [rfReplaceAll]);
        SendMessage(FocusHWnd, WM_SETTEXT, Length(WndText), LPARAM(PChar(WndText)));
      end;
      with ListView1.Items.Add do
      begin
        Caption := '[' + ClsName + '] = "' + WndText + '"';
        MakeVisible(False);
      end;
    end;
  end;

end;

Sprint 11. Feb 2005 09:10

Re: Text in Eingabefeld beliebiger Anwendungen ersetzen?
 
Zitat:

Zitat von FriFra
@toms: Das war mir schon klar... nur wie komme ich nun an den Text dieser Controls?

In deiner Signatur steht, das du Delphi Professional hast. Dann kannst du für Word die Komponente TWordApplication nehmen.

toms 11. Feb 2005 09:16

Re: Text in Eingabefeld beliebiger Anwendungen ersetzen?
 
Zitat:

@toms: SDC??
Bei Google suchensdc delphi

FriFra 11. Feb 2005 09:26

Re: Text in Eingabefeld beliebiger Anwendungen ersetzen?
 
@Toms: Du meinst SwissDelphiCenter ? ;) ... die Abkürzung war mir jetzt nicht geläufig :oops:

Zitat:

Zitat von Sprint
In deiner Signatur steht, das du Delphi Professional hast. Dann kannst du für Word die Komponente TWordApplication nehmen.

Das hilft mir nicht weiter. Es soll ja bei JEDEM aktiven Eingabefeld funktionieren :gruebel:
Ich kann nicht für jedes nur denkbare Programm eine eigene Funktion basteln...

Das es geht, sieht man an diesem Programm: http://www.is.tuwien.ac.at/emu/

Sprint 11. Feb 2005 09:36

Re: Text in Eingabefeld beliebiger Anwendungen ersetzen?
 
Zitat:

Zitat von FriFra
Das hilft mir nicht weiter. Es soll ja bei JEDEM aktiven Eingabefeld funktionieren
Ich kann nicht für jedes nur denkbare Programm eine eigene Funktion basteln...
Das es geht, sieht man an diesem Programm: [EMU]

Das Programm arbeitet nach einem ganz anderen Prinzip.

FriFra 11. Feb 2005 09:40

Re: Text in Eingabefeld beliebiger Anwendungen ersetzen?
 
Zitat:

Zitat von Sprint
Das Programm arbeitet nach einem ganz anderen Prinzip.

Nach welchem denn? Es ist auf jeden Fall in der Lage in beliebigen Textfeldern beliebiger Programme Texte zu erkennen und zu ersetzen - genau das suche ich doch. :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 Uhr.
Seite 2 von 3     12 3      

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