![]() |
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. |
AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
Vorschlag:
Delphi-Quellcode:
macht den Bildaufbau ruhiger.
SEI.nShow := SW_MINIMIZE;
|
AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
Zitat:
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:
Oder weigert sich der Explorer das anzunehmen?
Style := GetWindowLong(aPanel.Tag, GWL_STYLE);
SetWindowLong(aPanel.Tag, GWL_STYLE, Style and NOT WS_BORDER ); |
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.
|
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. |
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:
Mir unverständlich ist, dass die Explorer-Instanzen erst nach etwa 20 Sekunden aus dem Taskmanager verschwinden
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; |
AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:
- > Disable Explorer Ribbon |
AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
Moin aus Hamburg.
Code:
... PostMessage scheint hier zuverlässiger zu sein.
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; Selbst nach mehrmaligen Starten werden alle Instanzen gelöscht, bei SendMessage habe ich immer Leichen mit ca. 8Mb und 6 Threads im Taskmanager |
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; |
AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 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