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

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
Erdbär
(Gast)

n/a Beiträge
 
#1

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

  Alt 11. Jul 2016, 19:00
Ich musste die eine (!) Routine jetzt zig mal durcharbeiten, um zu verstehen, was die überhaupt macht. Das ist ja vollkommen unübersichtlich mit den ganzen try...excepts.
Delphi-Quellcode:
procedure ErrorLog(ErrorInfo: string);
var
  slSave: TStringlist;
  sLogFileName: string; // um Logdateinamen vorzugeben
begin
  sLogFileName := ChangeFileExt(paramstr(0), '.log');
  slSave := TStringlist.Create;

  if FileExists(sLogFileName) then slSave.LoadFromFile(sLogFileName);

  slSave.Text := DateTimeToStr(Now) + #13#10 +
    ErrorInfo + #13#10 + #13#10 + slSave.Text;

  try // Schreibrechte im Ordner vorhanden?
    slSave.SaveToFile(sLogFileName);
  except
    MessageBox(0, 'Cannot write to LogFile.', 'ERROR', mb_IconHand);
  end;

  slSave.Free;
end;
Ja, eins sollte reichen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 11. Jul 2016, 19:06
Und wo ist der Ressourcenschutzblock geblieben?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Erdbär
(Gast)

n/a Beiträge
 
#3

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

  Alt 11. Jul 2016, 19:17
Was sollte da wie (und warum) geschützt werden?
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#4

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

  Alt 11. Jul 2016, 19:19
Zitat:
if FileExists(sLogFileName) then slSave.LoadFromFile(sLogFileName);
Beim Zugriff auf die Festplatte kann es zu zahlreichen Problemen kommen...

Neue externe Platten verwenden einen Sleep-Modus... ob das "FileExists" da ausreicht um die wachzurütteln???

Nur so ein Gedanke...

btw: Ich hab' bei EnumWindows versucht mit "If" abzufragen und D7 sagt mir "Incompatible Types"... Na ja, muß man ja auch nicht in diesem Fall, hatte mich nur gewundert da das bei "GetClassName" ja auch funzt (Prüfung auf <> 0).

@Erdbär:
Na das bei einer Exception die Stringlist trotzdem freigegeben wird !!!
Angehängte Dateien
Dateityp: txt TwoWinEx.txt (3,2 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Erdbär
(Gast)

n/a Beiträge
 
#5

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

  Alt 11. Jul 2016, 19:29
Starte das Programm doch von einer "schlafenden" Festplatte, vielleicht wacht die HD schon dadurch auf?
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#6

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

  Alt 11. Jul 2016, 19:32
@Erdbär: es ging um das Speichern...

@Luckie: wollte nicht schon wieder so 'ne lange Schlange posten... ist doch egal ob "txt" oder "dpr" oder "zip"...
  Mit Zitat antworten Zitat
Erdbär
(Gast)

n/a Beiträge
 
#7

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

  Alt 11. Jul 2016, 19:34
Habe kein Floppy-Diskettenlaufwerk mehr
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#8

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

  Alt 15. Jul 2016, 05:42
Hab' jetzt 3 Versionen:

TwoWinEx [FirstVersion]:
Funktioniert gut, kann aber in seltenen Fällen sein, dass ein Fenster im Hintergrund bleibt, obwohl das eigentlich bei "ShellExecute" und "Show" gar nicht sein dürfte.

TwoWinEx [MinAllWnds]:
100% stabil bei mir... sollte "Show" tatsächlich mal ein Fenster nicht nach vorne bringen spielt das keine Rolle, es werden ja vorher alle Fenster minimiert.

TwoWinEx [Restore]:
100% stabil bei mir... konnte ich aber noch nicht so lange ausprobieren.
Läuft mit "ShowWindow [SW_Minimize und SW_Restore]", alles andere funktionierte einmal mehr nicht.

"SetForegroundWindow" funktioniert für ein Fenster sehr gut, aber für zwei leider überhaupt nicht (Eins bleibt immer hinten).
"SetWindowPos" in Verbindung mit "HWND_NOTOPMOST" funktioniert ebenfalls überhaupt nicht. Wenn ich z.B. einige Editoren und einige Taschenrechner im Vordergrund habe und es sind schon 2 WinEx-Fenster geöffnet, dann bewegen sich die WinEx-Fenster kein Stück nach vorne... sehr komisch...

Das hier funzt bei mir sehr gut:
Delphi-Quellcode:
Procedure Bring2ToFront;
  Var
   WorkArea : TRect;
   Wnd1, Wnd2: THandle;
 Begin
  Try
   SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea,0) ;
    Wnd1:= StrToInt(slFoundWnd[0]);
    Wnd2:= StrToInt(slFoundWnd[1]);

    If IsIconic(Wnd1)
    Then
     Begin
      ShowWindow(Wnd1, SW_RESTORE);

      MoveWindow(Wnd1,
                 WorkArea.Left,
                 WorkArea.Top,
                 ((WorkArea.Right-WorkArea.Left) Div 2),
                 (WorkArea.Bottom-WorkArea.Top),
                 True);
     End
    Else
     Begin
      ShowWindow(Wnd1, SW_MINIMIZE);
      ShowWindow(Wnd1, SW_RESTORE);

      MoveWindow(Wnd1,
                 WorkArea.Left,
                 WorkArea.Top,
                 ((WorkArea.Right-WorkArea.Left) Div 2),
                 (WorkArea.Bottom-WorkArea.Top),
                 True);
     End;


    If IsIconic(Wnd2)
    Then
     Begin
      ShowWindow(Wnd2, SW_RESTORE);

      MoveWindow(Wnd2,
                 ((WorkArea.Right-WorkArea.Left) Div 2),
                 WorkArea.Top,
                 ((WorkArea.Right-WorkArea.Left) Div 2),
                 (WorkArea.Bottom-WorkArea.Top),
                 True);
     End
    Else
     Begin
      ShowWindow(Wnd2, SW_MINIMIZE);
      ShowWindow(Wnd2, SW_RESTORE);

      MoveWindow(Wnd2,
                ((WorkArea.Right-WorkArea.Left) Div 2),
                WorkArea.Top,
                ((WorkArea.Right-WorkArea.Left) Div 2),
                (WorkArea.Bottom-WorkArea.Top),
                True);
     End;
  Except
   On E: Exception
   Do ErrorLog('Bring2ToFront'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;

Was der Restore-Version noch fehlt wäre eine Pfad-Anpassung. Das ist erstmal in Einzelschritten betrachtet sehr leicht:

1. Fenster nach vorne holen (passiert ja schon...)
2. VK_F4 und VK_ESC senden
z.B. so:
Delphi-Quellcode:
Procedure SendF4_ESC;
  Var
   KeyInputs: Array Of TInput;

  Procedure KeybdInput(VKey: BYTE; Flags: DWORD);
   Begin
    SetLength(KeyInputs, Length(KeyInputs)+1);
    KeyInputs[High(KeyInputs)].Itype:= INPUT_KEYBOARD;
     With KeyInputs[High(KeyInputs)].Ki
     Do
      Begin
       wVk := VKey;
       wScan := MapVirtualKey(wVk, 0);
       dwFlags:= Flags;
      End;
   End;

 Begin
  Try
   KeybdInput(VK_F4, 0);
   KeybdInput(VK_F4, KEYEVENTF_KEYUP);

   KeybdInput(VK_ESCAPE, 0);
   KeybdInput(VK_ESCAPE, KEYEVENTF_KEYUP);

   SendInput(Length(KeyInputs), KeyInputs[0], SizeOf(KeyInputs[0]));
  Except
   On E: Exception
   Do ErrorLog('SendF4_ESC'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;
3. Edit-Feld des Windows-Explorer-Fensters suchen bzw. finden:
z.B. so:
Delphi-Quellcode:
Function ChildWndCallback(Wnd: HWND; lParam: LongInt): BOOL; StdCall;
  Var
   ClassName: Array[0..255] Of Char;
 Begin
  Try
   If GetClassName(Wnd, ClassName, 255) <> 0
   Then
    Begin
     If Pos('Edit', String(ClassName)) <> 0
     Then
      Begin
       slChildWnd.Add(IntToStr(Wnd));
       Result:= False;
      End;
     Result:= True;
    End
  Except
   On E: Exception
   Do ErrorLog('ChildWndCallback'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;
4. Pfad senden: SendMessage(hChildWnd, WM_SETTEXT, 0, Integer(PChar('C:\')));

5. VK_RETURN senden

Allerdings wenn man alles zusammen schnell hintereinander haben möchte, dann braucht man wohl ein spezielles Timing. Also ein Delay oder Sleep oder Timer .... Ich hab' s ohne Sleep noch nie hinbekommen und außerdem ist das Ganze ein ziemlicher Overhead wenn ich das vergleiche mit den schon funktionierenden Versionen.

Hätte nie gedacht, das einen sowas Kleines 'ne ganze Weile beschäftigen kann...
Vielleicht hab' ich das auch einfach verkehrt gemacht und deshalb nicht hinbekommen... Ich mußte bis jetzt noch nie an anderen Programmen herumfummeln...
Angehängte Dateien
Dateityp: txt TwoWinEx [FirstVersion].txt (2,8 KB, 4x aufgerufen)
Dateityp: txt TwoWinEx [MinAllWnds].txt (3,2 KB, 8x aufgerufen)
Dateityp: txt TwoWinEx [Restore].txt (4,1 KB, 6x aufgerufen)

Geändert von FarAndBeyond (15. Jul 2016 um 06:26 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:50 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-2025 by Thomas Breitkreuz