Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktion für mehrere Fenster (n help) (https://www.delphipraxis.net/143198-funktion-fuer-mehrere-fenster-n-help.html)

110110 11. Nov 2009 22:33


Funktion für mehrere Fenster (n help)
 
hi, ich habe hier diese funktion gefunden:

Delphi-Quellcode:
type THandleArray = array of HWND;

function FindAllWindows(const WindowCaption: String): THandleArray;
type
  PParam = ^TParam;
  TParam = record
    WindowCaption: String;
    Res: THandleArray;
  end;
var
  Rec: TParam;
  function _EnumProc(_hWnd: HWND; _LParam: LPARAM): LongBool; stdcall;
  var
    cTitle: array[0..1023] of Char;
  begin
    with PParam(_LParam)^ do
    begin
      GetWindowText(_hWnd, cTitle, SizeOf(cTitle));
      if (CompareText(cTitle, WindowCaption) = 0) then
      begin
        SetLength(Res, Length(Res)+1);
        Res[Length(Res)-1] := _hWnd;
      end;
      Result := True;
    end;
  end;
begin
  Rec.WindowCaption := WindowCaption;
  SetLength(Rec.Res, 0);
  EnumWindows(@_EnumProc, Integer(@Rec));
  Result := Rec.Res;
end;
die funktion sollte mir ermöglichen fenster mit dem gleichen titel anzusprechen. In meinem Fall wäre das mit
Postmessage();

Also nehmen wir an ich habe 2 programme am laufen (2 mal das gleiche)

wie kann ich damit nun auf ein bestimmtes der beiden fenster zugreifen?
wie wird das angewendet? (postmessage)

dankeschön =)

Luckie 11. Nov 2009 23:18

Re: Funktion für mehrere Fenster (n help)
 
Du brauchst ein zweites Unterscheidungsmerkmal, sonst kannst du die Fenster nicht auseinander halten.

110110 12. Nov 2009 15:47

Re: Funktion für mehrere Fenster (n help)
 
danke, hast mir fast geholfen.
bei der beschreibung der oben geposteten funktion stand dabei dass sie genau für solche zwecke sei (2 gleiche fenster zu unterscheiden).

hab noch gehört es würde z.B. mit lauf"zeit" unterscheidbar sein aber wie ich das jetzt umsetzen kann weiß ich leider immer noch nicht. vll findet sich ja noch wer der mir helfen kann/will =)

Wolfgang Mix 12. Nov 2009 15:58

Re: Funktion für mehrere Fenster (n help)
 
@110110:

Erst einmal herzlich willkommen inder der DP :dp:

Du hast geschrieben:

Zitat:

hi, ich habe hier diese funktion gefunden:
In solchen Fällen wüßten wir auch gerne, wo (URL) Du
den Quelltext gefunden hast.

Gruß

Wolfgang

himitsu 12. Nov 2009 16:04

Re: Funktion für mehrere Fenster (n help)
 
Zitat:

Zitat von 110110
wie wird das angewendet? (postmessage)

Na du bekommst von der Funktion ein Array mit allen gefundenen Fenstern drinnen
und dieses Array, bzw. die Fenster-Handle darin, kannst du nun auswerten, wie du willst und wie man es mit Arrays so im allgemeinen auch macht.
Zitat:

Zitat von 110110
wie kann ich damit nun auf ein bestimmtes der beiden fenster zugreifen?

tja, wenn du ein bestimmtest willst, dann wirst du dir wohl noch ein (paar) weitere Unterscheidungskriterien aussuchen müssen.

Hier bekommst du erstmal nur die Handle von allen (Toplevel)Fenstern, welche den gesuchten Namen im Titel haben.

toms 12. Nov 2009 16:05

Re: Funktion für mehrere Fenster (n help)
 
Die Fenster unterscheiden sich durch ein unterschiedliches Handle. D.h. wenn zwei Fenster mit dem gleichen Titel geöffnet sind, gibt es zwei unterschiedliche Handles im THandleArray.

110110 12. Nov 2009 17:20

Re: Funktion für mehrere Fenster (n help)
 
danke erstmal an alle!

also, wo ich die function genau gefunden habe weiß ich leider nicht mehr *schäm* (stand aber auch nicht mehr dabei "leider")

wie ich euch jetzt verstanden habe gibt mir die function keinen normalen handle wie bei findwindow() sondern unterscheidet bei gleichen titeln auch noch bzw. gibt mir dann andere handles?

hab leider noch nicht sehr viel erfahrung mit hwnd und hab daher auch noch kA wie ich jetzt sagen kann sende postmessage an das bestimmte handle das ich durch die function ausgewählt hab oO könnt ihr mir bitte ein wenig unter die arme greifen? :)

hab hier mal was versucht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  h:thandlearray;
begin
h := FindAllWindows('Rechner');
//--
  if h[0]<>0 then                               //0 oder 1 instanz
begin
    sleep(4000);
    PostMessage(hwnd(h[0]), WM_KeyDown, $39, 0); //0 oder 1 instanz
    Application.ProcessMessages;
//--
end;

end;
habs grad mal am rechner ausprobiert und dachte ich könnte jetzt einfach im array unterscheiden zwischen 1. und 2. instanz vom rechner aber das ging leider nicht. postmessage sendet trotzdem noch an den zuletzt aktiven rechner.

toms 12. Nov 2009 17:50

Re: Funktion für mehrere Fenster (n help)
 
Die FindWindow-Funktion ermittelt das Handle des ersten gefundenen Top-Level-Fensters.
Wenn z.B. zwei Notepad Instanzen geöffnet sind mit dem gleichen Titel,
dann findet FindWindow immer nur eines der Fenster resp. gibt nur immer ein Handle einer Notepad Instanz zurück.

FindAllWindows liefert dir alle Handles der geöffneten Top-Level-Fenster,
bei welchen der Fenstertitel mit dem Parameter WindowCaption übereinstimmt.
Diese Handles werden im Array THandleArray zurückgegeben.

Anwendungsbeispiel der Funktion:

Delphi-Quellcode:
var
  FensterHandles: THandleArray;
  i: Smallint;
begin
  FensterHandles := FindAllWindows('Unbenannt - Editor'); // Alle Fenster mit Titel 'Unbenannt - Editor' suchen
  for i := Low(FensterHandles) to High(FensterHandles) do
  begin
    ShowMessage(IntToStr(FensterHandles[i])); // Handle des Fensters anzeigen
  end;
end;

110110 12. Nov 2009 18:06

Re: Funktion für mehrere Fenster (n help)
 
sieht für mich aus als würde die funktion dennoch nicht unterscheiden oO schaut euch doch mal bitte meinen vorletzten post an da hab ich mich dran versucht aber es sendet dennoch an die zuletzt aktive instanz vom rechner

toms 12. Nov 2009 18:13

Re: Funktion für mehrere Fenster (n help)
 
Bei mir sendet es an beide Instanzen.

Test:

Delphi-Quellcode:
h := FindAllWindows('Rechner');
if High(h) = 1 then // Wenn 2 Rechner Instanzen gefunden
begin
  PostMessage(hwnd(h[0]), WM_KeyDown, $39, 0); // an erste Instanz senden
  PostMessage(hwnd(h[1]), WM_KeyDown, $39, 0); // an zweite Instanz senden
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 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