Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Edit einer Fremdanwendung füllen - Es will einfach nicht klappen (https://www.delphipraxis.net/177087-edit-einer-fremdanwendung-fuellen-es-will-einfach-nicht-klappen.html)

wadriller 15. Okt 2013 10:49

Edit einer Fremdanwendung füllen - Es will einfach nicht klappen
 
Hallo zusammen.

Seit gestern wühle ich mich durchs Forum und hab jetzt glaube alle Wege durch und nichts scheint zu klappen.

Relativ einfache Geschichte.

Ich habe ein kleines Programm welches ein Edit und 2 Buttons hat.

In das Edit will ich mit meinem Delphiprogramm etwas eintragen und einen Knopf drücken.

Soweit so klar.
Findwindow, FindwindowEx, Sendmessage klappen aber einfach nicht.

Den Findcode habe ich mir sowohl mal mit WinSpy als auch mit X-Spy generieren lassen.
Beim debuggen wird wohl auch ein Handle ermittelt aber das Sendmessage scheint trotzdem nicht zu gehen.

Hier mal der übersichtliche Code:

Code:
var
  wnd, cwnd: HWND;
begin
  wnd:=0;
  cwnd:=0;
  wnd := FindWindow('#32770', '');
  cwnd := FindWindowEx(wnd, 0, 'Edit', nil);

  if cwnd <> 0 then
  begin
    SendMessage(cwnd,WM_Settext,0,integer(pchar('12')));
  end;
end;
Bei WinSpy kann ich das Edit auswählen und auch via WinSpy füllen.
Nur per Delphi geht es irgendwie nicht.

Kann man eine Anwendung gegen "Fremdsteuerung" schützen ?

Wenn es hilft kann ich auch den Link zu der Exe posten die ich steuern will.

wadriller 15. Okt 2013 13:15

AW: Edit einer Fremdanwendung füllen - Es will einfach nicht klappen
 
OK.

Ich bin schon ein Stück weiter gekommen. Mittels dem Tool "Winspector" hab ich rausgefunden das die Klasse '#32770' wohl von allem möglichem verwendet wird und da vieles davon wohl auch ein Edit auf sich liegen hat findet man das falsche Handle.

Falls jemand sowas auch mal sucht. Hier meine aktuelle Lösung (aktuell noch mit "grafischer" Ausgabe).

Erstmal sich man sich alle Handle die es zur Klasse '#32770' gibt.
Und danach sucht man auf jedem der Handle nach einem "Indikator" ob man das richtige Fenster hat.
In meinem Fall liegt ein Label mit dem Programmnamen auf der Form

Code:
function EnumChildren(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
  SearchedClass = '#32770';
var
  ClassName: array[0..259] of Char;
begin
  Result := True;
  GetClassName(hwnd, ClassName, Length(ClassName));
  if ClassName = SearchedClass then
    TStrings(lParam).Add(IntTostr(hwnd));
end;

procedure Button2Click(Sender: TObject);
var
  Hauptwnd, Childwnd, EditWnD: HWND;
  i: Integer;
begin
  Hauptwnd:=0;
  Childwnd:=0;
  EditWND := 0;

  Memo1.Clear;
  Memo2.Clear;
// Erst suchen wir alle Handle die es gibt
  EnumChildWindows(Childwnd, @EnumChildren, UINT_PTR(Memo1.Lines));

// Jetzt schauen wir auf welchem das Label liegt woran man festmachen kann das es das richtige Fenster ist
  for I := 0 to Memo1.Lines.Count -1 do begin
    Childwnd := FindWindowEx(strtoint(Memo1.Lines[i]),0,'Static','Inhalt des Labels');
    if Childwnd <> 0 then begin
      Memo2.Lines.Add(Memo1.Lines[i]);
      Childwnd := 0;
      break;
    end;
  end;

// Wenn wir jetzt ein Fenster gefunden haben, suchen wir auf dem Fenster nach dem Edit
  if memo2.Lines.Count > 0 then begin
    EditWnd := FindWindowEx(strtoint(Memo2.Lines[0]),0,'Edit',0);
  end;

// Wenn wir was gefunden haben schreiben wir den Text rein
  if Editwnd <> 0 then
  begin
    SendMessage(Editwnd,WM_Settext,0,integer(pchar('12')));
  end;
end;

himitsu 15. Okt 2013 13:52

AW: Edit einer Fremdanwendung füllen - Es will einfach nicht klappen
 
Zitat:

#32770 = The class for a dialog box.
http://msdn.microsoft.com/en-us/libr.../ms633574.aspx

Luckie 16. Okt 2013 02:30

AW: Edit einer Fremdanwendung füllen - Es will einfach nicht klappen
 
Such doch gleich nach dem Fenstertzitel.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr.

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