AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

Ein Thema von FarAndBeyond · begonnen am 23. Jun 2015 · letzter Beitrag vom 19. Jul 2016
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 6. Sep 2015, 00:08
Kann es sein, dass du eine "Exception Paranoia" hast?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#2

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 6. Sep 2015, 03:14
@Sir Rufo:
Nennt man das jetzt so? ... grins...
Ja mag sein, dass die Bezeichnung ins Schwarze trifft...

Ich hab' jetzt zwar gelernt, wie man es offiziell richtig macht, aber ich kann mich noch nicht so richtig dazu durchringen das umzusetzen. Es gibt da immer noch so eine Stimme die sagt:"Mach das Programm nicht zu geschwätzig, mach 'n ErrorLog für dich und schick' nur die Meldung 'raus, die dem Nutzer auch wirklich weiterhelfen kann.
Ich pendel noch zwischen den Polen und werd' meinen Weg wohl noch finden...

Kann sich nur noch um 100 Jahre handeln...

Ach so, vielleicht hast du auch einfach nur das WM_Quit gesehen... das kann da eigentlich weg... hab' 'n bisschen 'rumgespielt...

Hat aber auch 'was praktisches, ich teste meine Programme meistens außerhalb der IDE, dann muß ich bei 'nem falschen Stringlist Index nicht immer per Taskmanager Delphi7 killen und anschließend wieder neu starten... so weiß ich immer wo es kracht und zwar präzise mit meinen eigenen Worten bzw. Prozeduren...

Gut Ding will Weile haben oder wie war das...
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 6. Sep 2015, 12:03
Hat aber auch 'was praktisches, ich teste meine Programme meistens außerhalb der IDE, dann muß ich bei 'nem falschen Stringlist Index nicht immer per Taskmanager Delphi7 killen und anschließend wieder neu starten... so weiß ich immer wo es kracht und zwar präzise mit meinen eigenen Worten bzw. Prozeduren...
Auch bei Delphi 7 konnte man das Programm stoppen wenn ein Fehler aufgetreten ist. Es gibt zwar keinen so schönen Stopp-Button in der ToolBar, aber über das Menü "Start" (so heißt es bei Delphi 2010 und XE3 und XE4 und ... kann man das Programm stoppen. Alternativ über den HotKey STRG + F2. Solltest du mal ausprobieren. Dann kannst du auch den Debugger sinvoll nutzen.
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#4

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 6. Sep 2015, 19:29
@Aviator:
Ja, das wär' schön... bei kleineren Fehlern, die mal auftreten kann man RESET (STRG+F2) drücken und ist wieder in der IDE. Aber bei sehr vielen StringlistINDEX-Fehlern stoppt Delphi das Programm und zeigt das auch in der Titelleiste an. Dann funktioniert RESET nicht mehr und auch per Taskmanager kann ich das Programm nicht mehr abschießen.
Das Einzige was dann noch geht ist Delphi7 komplett per Taskmanager abzuschießen und das ist nervig, da ich dann alle Units neuladen muss und wieder an die Position wo ich war gehen muss...
Man kann den Ladevorgang zwar automatisieren, aber damit hatte ich schonmal 'ne Menge "Spass" und hab' das dann wieder abgeschaltet.

Ja ich hab' gehört, dass es einen Debugger gibt, hab' ihn noch nie benutzt... vielleicht wird das irgendwann mal interessant, wenn ich genau herausfinden muss was der Prozess genau macht. Normalerweise programmiere ich einfach alles um, schließlich kann man ja eine Sache auf 1000 verschiedene Arten machen und die verschiedensten Befehle dazu nutzen. Also wenn etwas auf eine Art nicht klappt, egal ob es an mir liegt oder daran, dass es einfach so nicht geht, dann mache ich es eben auf eine andere Art...
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#5

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 28. Nov 2015, 05:05
Final Version...

- fehlendes FensterHandle hinzugefügt
- Overkill entfernt
- Exception-Handling minimal informativer gemacht
- kein Sleep erforderlich

Ergebnis: läuft super schnell und stabil bei mir...
Sollte ich alle paar Monate die Fenster mal wieder neu positionieren müssen wäre mir das auch egal, aber bis jetzt läuft alles sauber...
Läuft auch unter Lazarus // {$Mode Delphi} // oder selber Handanlegen und anpassen

Delphi-Quellcode:
Program TwoWindowsExplorer;

 Uses
  Windows, Messages, Classes, SysUtils, ShellApi;

Type
  PFindWindowStruct = ^TFindWindowStruct;
  TFindWindowStruct = Record
   Caption : String;
   ClassName : String;
   WindowHandle: THandle;
  End;

 Var
  FoundWindows: TStringlist;
  WndHandle : THandle;


Procedure ErrorLog(ErrorInfo: String);
  Var
   LoadErrorLog : TStringlist;
   SaveErrorInfo: TStringlist;
   ErrorLog : String;

  Procedure Free_LoadErrorLog;
   Begin
    Try
     FreeAndNil(LoadErrorLog);
    Except
    End;
   End;

  Procedure Free_SaveErrorInfo;
   Begin
    Try
     FreeAndNil(SaveErrorInfo);
    Except
    End;
   End;

  Function ErrorLogExists : Boolean;
   Begin
    Try
     Result:= False;
      If FileExists('ErrorLog.txt')
      Then
       Begin
        Try
         LoadErrorLog:= TStringlist.Create;
         LoadErrorLog.LoadFromFile('ErrorLog.txt');
         ErrorLog:= LoadErrorLog.Text;
         Result:= True;
        Finally
         Free_LoadErrorLog;
        End;
       End;
    Except
    End;
   End;

 Begin
  Try
   Try
    SaveErrorInfo:= TStringlist.Create;
     SaveErrorInfo.Add(DateTimeToStr(Now));
     SaveErrorInfo.Add(ErrorInfo);

      If ErrorLogExists
      Then
       Begin
        SaveErrorInfo.Add(' ');
        SaveErrorInfo.Add(Trim(ErrorLog));
       End;

     SaveErrorInfo.SaveToFile('ErrorLog.txt');
   Finally
    Free_SaveErrorInfo;
   End;
  Except
  End;
 End;


Function EnumWindowsProc(hWindow: HWND; lParam: LongInt): Boolean; StdCall;
  Var
   lpBuffer : PChar;
   WindowCaptionFound: Boolean;
   ClassNameFound : Boolean;

  Procedure Free_Memory;
   Begin
    Try
     FreeMem(lpBuffer, SizeOf(lpBuffer^));
    Except
     On E: Exception
     Do ErrorLog('EnumWindowsProc: Free_Memory Failed'+#13#10+E.ClassName+#13#10+E.Message);
    End;
   End;

 Begin
  Try
   GetMem(lpBuffer, 255);
   Result := True;
   WindowCaptionFound:= False;
   ClassNameFound := False;
   Try
    If GetWindowText(hWindow, lpBuffer, 255) > 0
    Then
     Begin
      If PFindWindowStruct(lParam).Caption = ''
      Then WindowCaptionFound:= True
      Else
       Begin
        If Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0
        Then WindowCaptionFound:= True;
       End;

      If PFindWindowStruct(lParam).ClassName = ''
      Then ClassNameFound:= True
      Else
       Begin
        If GetClassName(hWindow, lpBuffer, 255) > 0
        Then
         Begin
          If Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer)) > 0
          Then ClassNameFound:= True;

          If (WindowCaptionFound And ClassNameFound)
          Then
           Begin
            PFindWindowStruct(lParam).WindowHandle:= hWindow;
            FoundWindows.Add(IntToStr(hWindow));
           End;
         End;
       End;
     End;
   Finally
    Free_Memory;
   End;
  Except
   On E: Exception
   Do ErrorLog('EnumWindowsProc Failed'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;


Function FindAWindow(WinCaption: String; WinClassName: String): THandle;
  Var
   WindowInfo: TFindWindowStruct;
 Begin
  Try
   WindowInfo.Caption := WinCaption;
   WindowInfo.ClassName := WinClassName;
   WindowInfo.WindowHandle:= 0;

   EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
   Result:= WindowInfo.WindowHandle;
  Except
   On E: Exception
   Do ErrorLog('FindAWindow Failed'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;


Procedure StartTwoExplorer;
 Begin
  Try
   If DirectoryExists('I:\')
   Then
    Begin
     ShellExecute(0, Nil, PChar('I:\MARTIN'), Nil, Nil, SW_SHOW);
     ShellExecute(0, Nil, PChar('I:\MARTIN\(DOWNLOADS)'), Nil, Nil, SW_SHOW);
    End
   Else
    Begin
     ShellExecute(0, Nil, PChar('C:\'), Nil, Nil, SW_SHOW);
     ShellExecute(0, Nil, PChar('D:\'), Nil, Nil, SW_SHOW);
    End;
  Except
   On E: Exception
   Do ErrorLog('StartTwoExplorer Failed'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;


Procedure CloseOneExplorer;
 Begin
  Try
   WndHandle:= StrToInt(FoundWindows[0]);
   PostMessage(WndHandle, WM_CLOSE, 0, 0);
   StartTwoExplorer;
  Except
   On E: Exception
   Do ErrorLog('CloseOneExplorer Failed'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;


Procedure TwoExplorerToFront;
  Var
   I: Integer;
 Begin
  Try

   For I:= 0 To FoundWindows.Count-1
   Do
    Begin
     WndHandle:= StrToInt(FoundWindows[I]);
     If IsIconic(WndHandle)
     Then ShowWindow(WndHandle, SW_RESTORE)
     Else
      Begin
       ShowWindow(WndHandle, SW_MINIMIZE);
       ShowWindow(WndHandle, SW_RESTORE);
      End;
    End;
    
  Except
   On E: Exception
   Do ErrorLog('TwoExplorerToFront Failed'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;


Procedure CloseAllExplorer;
  Var
   I: Integer;
 Begin
  Try

   For I:= 0 To FoundWindows.Count-1
   Do
    Begin
     WndHandle:= StrToInt(FoundWindows[I]);
     PostMessage(WndHandle, WM_CLOSE, 0, 0);
    End;

   StartTwoExplorer;
  Except
   On E: Exception
   Do ErrorLog('CloseAllExplorer Failed'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;


Procedure Free_Stringlist;
 Begin
  Try
   FreeAndNil(FoundWindows);
  Except
   On E: Exception
   Do ErrorLog('Free_Stringlist Failed'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;


Begin
 Try
  FoundWindows:= TStringlist.Create;
   Try
    FindAWindow('','CabinetWClass');

     Case FoundWindows.Count
     Of
      0 : StartTwoExplorer;
      1 : CloseOneExplorer;
      2 : TwoExplorerToFront;
      Else CloseAllExplorer;
     End;

   Finally
    Free_Stringlist;
   End;
 Except
  On E: Exception
  Do ErrorLog('MainProgram Failed'+#13#10+E.ClassName+#13#10+E.Message);
 End;
End.
Fur alle die Windows 7 mögen und dazu noch den WindowsExplorer hier eine einfache Anleitung:

1.
Quicklaunch einrichten und Icon auswählen, Rechtsklick auf Icon - Eigenschaften: Pfad zur EXE eingeben

2.
Icon klicken und damit die EXE zum ersten Mal starten

3.
Fenster positionieren (Hinweis: Die Fenster müssen von Hand ausgerichet werden. Man kann aber die automatische Andockmöglichkeit unter Windows7 nutzen damit das schneller geht. Ausschließlich Andocken geht nicht, da sich der Explorer dann die Position nicht merkt!

4.
Fenster schließen und erneut auf das eingerichtete Icon klicken: Feintuning vornehmen, so das nur noch 1 Pixel oder wenige Pixel unten unausgefüllt bleiben...
Wer Lust hat zu Fummeln bekommt sicher auch den letzten Pixel noch weg...

5.
Fertig! Ab jetzt nur noch den neuen Button benutzen, egal ob kein Fenster gestartet ist oder nur ein Fenster sichtbar ist oder ob beide Fenster schon im Hintergrund laufen...
Es ist nur noch ein Klick notwendig um die beiden WindowsExplorer-Fenster anzeigen zu lassen.

Hinweis: Es kann sein, dass man bis zu 3 bis 4 Versuche benötigt bis sich der WindowsExplorer die Position gemerkt hat.
Wenn die Position dann einmal drin ist hat man Ruhe und gleichzeitig läuft das Ganze richtig schnell...

Ob das auch unter Windows 8 oder 8.1 läuft kann ich nicht sagen.
Ob das auch mit mehreren Monitoren oder größeren Monitoren und mehr Fenstern geht kann ich auch nicht sagen... TryAndError...for yourself...
Angehängte Grafiken
Dateityp: png TwoWindowsExplorer Screenshot.png (201,8 KB, 35x aufgerufen)

Geändert von FarAndBeyond (28. Nov 2015 um 05:15 Uhr) Grund: Screenshot
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 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