Delphi-PRAXiS
Seite 2 von 7     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren (https://www.delphipraxis.net/185596-zwei-windows-explorer-starten-und-nebeneinander-bildschirmfuellend-positionieren.html)

mm1256 27. Jun 2015 07:51

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

also wenn ihr schon den Overhead mit einem eigenen Formular bzw. einer VCL-Anwendung gehen wollt, dann nimmt man einfach zwei (oder mehrere) Panels und klatscht da jeweils eine Explorer-Instanz hinein. Das ist nicht mehr als ein 2-Minuten-Programm. 8-)

In Beispiel ist Panel1.Align = alLeft und Panel2.Align = alClient.

Delphi-Quellcode:
unit uWinExplorer2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TFrmExplorer2 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    procedure FormShow(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure ExplorerStart(aPanel: TPanel;
                            aDirectory: string);
  end;

var
  FrmExplorer2: TFrmExplorer2;

implementation

{$R *.dfm}

uses ShellApi;

procedure TFrmExplorer2.ExplorerStart(aPanel: TPanel;
                                      aDirectory: string);
var
  SEI: TShellExecuteInfo;
  Style: Integer;
begin
  aPanel.Caption := aDirectory;
  FillChar(SEI, SizeOf(SEI), #0);
  SEI.cbSize := SizeOf(SEI);
  SEI.Wnd := Handle;
  SEI.fMask := SEE_MASK_NOCLOSEPROCESS;
  SEI.lpVerb := 'open';
  SEI.lpFile := PChar('explorer.exe');
  SEI.lpParameters := PChar(aDirectory);
  SEI.lpDirectory := nil;
  SEI.nShow := SW_SHOWMAXIMIZED;
  if ShellExecuteEx(@SEI) then begin
    if SEI.hProcess > 32 then begin
      Sleep(500);
      aPanel.Tag := FindWindow('CabinetWClass',nil);
      if aPanel.Tag > 0 then begin
        Winapi.Windows.SetParent(aPanel.Tag, aPanel.Handle);
        Style := GetWindowLong(aPanel.Tag, GWL_STYLE);
        SetWindowLong(aPanel.Tag, GWL_STYLE, Style and NOT WS_BORDER );
      end;
    end;
  end;
  CloseHandle(SEI.hProcess);
end;

procedure TFrmExplorer2.FormResize(Sender: TObject);
begin
  Panel1.Width := ClientWidth div 2;
  if Panel1.Tag > 0 then MoveWindow(Panel1.Tag, 0, 0, Panel1.Width, Panel1.Height, True);
  if Panel2.Tag > 0 then MoveWindow(Panel2.Tag, 0, 0, Panel2.Width, Panel2.Height, True);
end;

procedure TFrmExplorer2.FormShow(Sender: TObject);
begin
  Caption := 'Windows-Explorer mit zwei Fenstern';
  ExplorerStart(Panel1,'C:\Windows');
  ExplorerStart(Panel2,'C:\Users');
end;

end.

hathor 27. Jun 2015 11:43

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

Delphi-Quellcode:
  SEI.nShow := SW_MINIMIZE;
macht den Bildaufbau ruhiger.

mm1256 27. Jun 2015 16:09

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

Zitat von hathor (Beitrag 1306823)
Vorschlag:

Delphi-Quellcode:
  SEI.nShow := SW_MINIMIZE;
macht den Bildaufbau ruhiger.

DANKE! :thumb:

Ein Problem gibt es noch: Die Explorerfenster haben beim Panel oben einen Rand etwa so hoch wie normalerweise die Titelleiste. Damit wollte ich den Rand eigentlich verhindern, aber irgendwas scheint noch zu fehlen. Hab schon rumprobiert, finde aber keine Lösung.

Delphi-Quellcode:
Style := GetWindowLong(aPanel.Tag, GWL_STYLE);
SetWindowLong(aPanel.Tag, GWL_STYLE, Style and NOT WS_BORDER );
Oder weigert sich der Explorer das anzunehmen?

mm1256 28. Jun 2015 07:16

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
 
Hat keiner eine Idee? Wäre schön, wenn man diesen blöden Rand weg bekommen würde.

hathor 28. Jun 2015 07:59

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
 
Das ist nicht der einzige Schönheitsfehler:

Die beiden Explorer-Instanzen bleiben im RAM als Leichen zurück und können nur im Task-Manager beendet werden.
Ich suche eine Lösung, evtl. mit CreateProcess/TerminateProcess.

mm1256 28. Jun 2015 11:14

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
 
Richtig, da fehlt noch was. Aus dem Grund hab ich mir ja auch die Handles im TPanel.Tag gemerkt.

Delphi-Quellcode:
procedure TFrmExplorer2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Panel1.Tag > 0 then SendMessage(Panel1.Tag, WM_CLOSE, 0, 0);
  if Panel2.Tag > 0 then SendMessage(Panel2.Tag, WM_CLOSE, 0, 0);
end;
Mir unverständlich ist, dass die Explorer-Instanzen erst nach etwa 20 Sekunden aus dem Taskmanager verschwinden

hathor 30. Jun 2015 09:46

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:

Zitat von mm1256 (Beitrag 1306925)
Hat keiner eine Idee? Wäre schön, wenn man diesen blöden Rand weg bekommen würde.

Mit Metro UI Tweaker (im Anhang) kriegt man Ribbon weg.
- > Disable Explorer Ribbon

markus5766h 8. Jul 2015 19:29

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
 
Moin aus Hamburg.

Code:
procedure TFrmExplorer2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Panel1.Tag > 0 then SendMessage(Panel1.Tag, WM_CLOSE, 0, 0);
  if Panel2.Tag > 0 then SendMessage(Panel2.Tag, WM_CLOSE, 0, 0);
end;
... PostMessage scheint hier zuverlässiger zu sein.
Selbst nach mehrmaligen Starten werden alle Instanzen gelöscht,
bei SendMessage habe ich immer Leichen mit ca. 8Mb und 6 Threads im Taskmanager

hathor 8. Jul 2015 19:55

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
 
Am Ende eines Programms sollte man immer PostMessage bevorzugen.
Ich habe es ausserdem in die Destroy-Procedure geschrieben.
Aber es dauert trotzdem lange, bis sie aus dem Task-Manager verschwinden.

Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Panel1.Tag > 0 then PostMessage(Panel1.Tag, WM_CLOSE, 0, 0);
  if Panel2.Tag > 0 then PostMessage(Panel2.Tag, WM_CLOSE, 0, 0);
end;

markus5766h 8. Jul 2015 20:42

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

Aber es dauert trotzdem lange, bis sie aus dem Task-Manager verschwinden.
ja, stimmt, bei mir ca. 15 bis 20 Sekunden - aber zuverlässig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.
Seite 2 von 7     12 34     Letzte »    

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