![]() |
AW: Programmposition beim Doppelaufruf ändern?
Ich weiß nicht obs auch leichter geht, aber man könnte sich die Fensternamen aller laufenden Handles ausgeben lassen und diese dann mitzählen. Bei mehr als 2 = Exit
Sowas zum beispiel ?! listbox zum mitlesen der Fensternamen // nicht getestet
Delphi-Quellcode:
public
{ Public-Deklarationen } end; PMyEnumParam = ^TMyEnumParam; TMyEnumParam = record lb: TListbox; end; ... FUNCTION TfrmMain.getAnzahlProgrammInstanzen(): Integer; VAR Param: TMyEnumParam; I: Integer; wndHandle : TwndHandle; meinCounter :integer; function GetWindows(const hWnd : Longword; Param: PMyEnumParam): LongBool; stdcall; var Len : Longint; S : String; begin Result := True; if not ( IsWindow(hWnd) and IsWindowVisible(hWnd) ) then Exit; Len := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0); if Len > 0 then begin SetLength(S, Len); SendMessage(hWnd, WM_GETTEXT, Len + 1, Longint(Pchar(S))); Param.lb.Items.Add(Inttostr(hwnd) + '; ' + s); end; // mit Result = False kann die Callbackfunktion vorzeitig verlassen werden end; BEGIN ListBox1.Items.Clear; Param.lb := Listbox1; Listbox1.Items.clear; EnumWindows(@GetWindows, LPARAM(@Param)); //F2 aus Taskleiste anzeigen FOR I := 0 TO ListBox1.Items.Count - 1 DO BEGIN //machwas mit den fensternamen IF Pos('FENSTERNAME', Trim(AnsiUppercase(ListBox1.Items.Strings[i]))) > 0 THEN inc(meinCounter); END; result := meinCounter; END; |
AW: Programmposition beim Doppelaufruf ändern?
Also ich verdeutliche das mal.
Meine Anwendung darf man auch 15 mal starten, nicht nur 2 mal, sondern x mal. Die Postion des Fensters wird abgespeichert und beim Aufruf der Anwendung gelesen. poDefaultPosOnly funktioniert bei mir nicht, da ich die Postion selber manuell bestimme, der Test hat das auch bestätigt. Ich denke das muss so laufen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin if (läuft schon eine Anwendung?) then begin PositionLeft=PositionLeft+20; PositionTop=PositionTot+20; end; end; |
AW: Programmposition beim Doppelaufruf ändern?
Achso ! Ich bin von nur 2 mal ausgegangen aufgrund dieser Aussage ;)
Zitat:
du könntest dir auch das Fensterhandle der zu letzt erstellten Instanz ausgeben lassen und daran dann die Aktuelle Position + 20 nehmen und dann deine neue Intanz erstellen. |
AW: Programmposition beim Doppelaufruf ändern?
Zitat:
|
AW: Programmposition beim Doppelaufruf ändern?
Ein Handle ist eine eindeutige Identifikationsnr, darüber lassen sich beispielsweise die fremde Fenster steuern.
also entweder die funktion die ich oben gepostet habe erweitern hier die Funktion, hoffe das war alles ;)
Delphi-Quellcode:
type
TwndHandle = record Handle :LongWord; title :string; end; ... FUNCTION TfrmMain.getMyHandle: TwndHandle; VAR Param: TMyEnumParam; I: Integer; myhandle : Cardinal; wndHandle : TwndHandle; function GetWindows(const hWnd : Longword; Param: PMyEnumParam): LongBool; stdcall; var Len : Longint; S : String; begin Result := True; if not ( IsWindow(hWnd) and IsWindowVisible(hWnd) ) then Exit; Len := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0); if Len > 0 then begin SetLength(S, Len); SendMessage(hWnd, WM_GETTEXT, Len + 1, Longint(Pchar(S))); Param.lb.Items.Add(Inttostr(hwnd) + '; ' + s); end; // mit Result = False kann die Callbackfunktion vorzeitig verlassen werden end; BEGIN ListBox1.Items.Clear; Param.lb := Listbox1; Listbox1.Items.clear; EnumWindows(@GetWindows, LPARAM(@Param)); wndHandle.Handle := 0; wndHandle.title := 'false'; //Fenster aus Taskleiste anzeigen FOR I := 0 TO ListBox1.Items.Count - 1 DO BEGIN IF Pos('Fenstername', Trim(AnsiUppercase(ListBox1.Items.Strings[i]))) > 0 THEN begin myHandle := StrtoInt(Copy(ListBox1.Items.Strings[i], 1, pos(';', ListBox1.Items.Strings[i]) - 1)); ShowWindow(myhandle,SW_SHOWNORMAL); wndHandle.Handle := myHandle; wndHandle.title := 'minimiert'; break; end; END; //Anmeldungsfenster zurückgeben FOR I := 0 TO ListBox1.Items.Count - 1 DO BEGIN //ANMELDUNG ist hier der Fenstername der gesucht wird IF Pos('ANMELDUNG', Trim(AnsiUppercase(ListBox1.Items.Strings[i]))) > 0 THEN begin myHandle := StrtoInt(Copy(ListBox1.Items.Strings[i], 1, pos(';', ListBox1.Items.Strings[i]) - 1)); wndHandle.Handle := myHandle; wndHandle.title := Copy(ListBox1.Items.Strings[i], pos(';', ListBox1.Items.Strings[i]) + 1,length(ListBox1.Items.Strings[i])); break; end; END; result := wndHandle; END; oder hier zum selber basteln ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz