![]() |
windows eigenschaften-dialog für datenträger anzeigen lassen
Guten Tag liebe Delphi Gemeinde!
Ich stehe irgendwie mal wieder vor einem Problem, vielleicht ist es was total einfaches, nur komme ich einfach nicht auf einen grünen Zweig.... Folgendes von ![]()
Delphi-Quellcode:
Bei Microsoft werde ich einfach nicht fündig wie man den Laufwerks-Eigenschaften-Dialog anzeigen lassen kann.
{ This code shows the standard file properties dialog like in Windows Explorer }
uses shellapi; // Thanks to Peter Below (TeamB) for this code procedure PropertiesDialog(FileName: string); var sei: TShellExecuteInfo; begin FillChar(sei, SizeOf(sei), 0); sei.cbSize := SizeOf(sei); sei.lpFile := PChar(FileName); sei.lpVerb := 'properties'; sei.fMask := SEE_MASK_INVOKEIDLIST; ShellExecuteEx(@sei); end; procedure TForm1.Button1Click(Sender: TObject); begin if Opendialog1.Execute then PropertiesDialog(Opendialog1.FileName); end; Weiß jemand wie das geht und kann mich vielleicht in die richtige Richtung stubsen? Danke für's lesen und jeden Tipp! |
AW: windows eigenschaften-dialog für datenträger anzeigen lassen
Hilft
![]() Es scheint so das statt
Delphi-Quellcode:
das hier gebraucht würde.
sei.lpVerb := 'properties';
Delphi-Quellcode:
sei.nShow = SW_SHOW;
|
AW: windows eigenschaften-dialog für datenträger anzeigen lassen
Vielen Dank für diesen Tipp, werde ich heut abend gleich mal ausprobieren, Danke danke!
|
AW: windows eigenschaften-dialog für datenträger anzeigen lassen
Hallo nochmal, also ich war in dem moment als ich das posting erstellte selbst nicht auf dem laufenden... Entschuldigung!
(mein code ist noch sehr unübersichtlich, unsortiert und kaum lesbar...) Der original code funktioniert einwandfrei, auch auf laufwerke. Mein problem ist zwar schon der "Eigenschaften-Dialog", allerdings auf einer anderen ebene. Ich poste morgen meinen Code (samt beispielanwendung). Ich benutze per Windows-Api das Kontext-Menu von Windows für Dateien und Verzeichnisse sowie auch Laufwerke. Bei Dateien und Ordner sowie auch Laufwerke öffnet sich das Windows-Menu wie gewünscht. Alles was das Kontext-Menu bietet wird, soweit mir bekannt, sauber und fehlerfrei abgearbeitet, nur eben bei Laufwerken erscheint nicht der Eigenschaften-Dialog. (ich habe momentan eine fail-safe sache reingebastelt, an der ich hoffe auf eine lösung zu kommen) Bis morgen in alter frische. |
AW: windows eigenschaften-dialog für datenträger anzeigen lassen
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen/Tag/Abend, hier jetzt mein Code-Problem wie oben beschrieben:
Delphi-Quellcode:
Im Beispiel Anhang ist unten ein "F9" Knopf drückbar (nicht per Hotkey) der auf meine erste Post verweist, da hatte ich mich geirrt, verzeihung nochmal.
// hier ist mein problem-kind
procedure TMain.InvokeContextMenu(const Owner: TWinControl; const Path: String; const X, Y: Integer); var // Item: Integer; DeskFolder, Folder: IShellFolder; Eaten, Attributes: ULONG; PIDL, FolderpIdl: PItemIDList; Menu: HMENU; Pos: TPoint; Cmd: DWORD; CommandInfo: TCMInvokeCommandInfo; ContextMenu: IContextMenu; ContextMenu2: IContextMenu2; ContextMenu3: IContextMenu3; APath: String; aFileName: String; aDrive: String; aContextMenu: Boolean; begin ContextMenu2 := nil; ContextMenu3 := nil; aContextMenu := False; aDrive := ExtractFileDrive(Path); APath := ExtractFilePath(Path); if (APath = aDrive) then APath := IncludeTrailingPathDelimiter(APath); aFileName := ExtractFileName(Path); // IShellFolder for Desktop folder (root) if Succeeded(SHGetDesktopFolder(DeskFolder)) then begin // Item ID List for the folder that the file or folder is in Attributes := 0; if Succeeded(DeskFolder.ParseDisplayName(INVALID_HANDLE_VALUE, nil, PWideChar(WideString(APath)), Eaten, FolderpIdl, Attributes)) then begin // IShellFolder for the folder the file is in Attributes := 0; if Succeeded(DeskFolder.BindToObject(FolderpIdl, nil, IShellFolder, Folder)) then if (Length(aFileName) > 0) then // Item ID List for the file or folder, relative to the folder it is in if Succeeded(Folder.ParseDisplayName(INVALID_HANDLE_VALUE, nil, PWideChar(WideString(aFileName)), Eaten, PIDL, Attributes)) then begin // connect IContextMenu with local PIDL ContextMenu aContextMenu := Succeeded(Folder.GetUIObjectOf(INVALID_HANDLE_VALUE, 1, PIDL, IContextMenu, nil, ContextMenu)); CoTaskMemFree(PIDL); end; // try to fallback to system context menu // an dieser stelle hüpft der code wenn man "Eigenschaften" von Laufwerken auswählt. if (not aContextMenu) then // connect IContextMenu with local FolderPIDL ContextMenu aContextMenu := Succeeded(DeskFolder.GetUIObjectOf(INVALID_HANDLE_VALUE, 1, FolderpIdl, IContextMenu, nil, ContextMenu)); CoTaskMemFree(FolderpIdl); end; end; if (not aContextMenu) then Exit; Menu := CreatePopupMenu; try // Populate our menu with shortcut items if (Cardinal(ContextMenu.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE)) and $80000000) = 0 then begin // ContextMenu2 used in WndProc if (ContextMenu.QueryInterface(IContextMenu2, ContextMenu2) = NO_ERROR) or (ContextMenu.QueryInterface(IContextMenu3, ContextMenu3) = NO_ERROR) then try Pos.X := X; Pos.Y := Y; Winapi.Windows.ClientToScreen(Owner.Handle, Pos); // launch the menu Bool(Cmd) := TrackPopupMenu(Menu, TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD, Pos.X, Pos.Y, 0, Handle, nil); finally // clear so that we don't intervene every owner drawn menu item message in // WndProc ContextMenu2 := nil; ContextMenu3 := nil; end; // Invoke command if we have one if Bool(Cmd) then begin FillChar(CommandInfo, SizeOf(CommandInfo), 0); CommandInfo.cbSize := SizeOf(CommandInfo); CommandInfo.HWnd := Handle; CommandInfo.lpVerb := PAnsiChar(MakeIntResource(Cmd - 1)); CommandInfo.fMask := CMIC_MASK_ICON or CMIC_MASK_UNICODE or CMIC_MASK_ASYNCOK or CMIC_MASK_NOZONECHECKS; CommandInfo.nShow := SW_SHOWNORMAL; OleCheck(ContextMenu.InvokeCommand(CommandInfo)); end; end; finally DestroyMenu(Menu); end; end; // das menu wird hiermit eingeleitet. // es wird immer der komplette pfad übermittelt. // für laufwerke wird der slash abgeschnitten. procedure TMain.LeftViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var S: String; begin if Button = mbRight then if LeftView.Selected <> nil then begin S := LeftShellItem(LeftView.Selected.Index).FullPath; if S[Length(S)] = '\' then S := Copy(S, 1, Length(S) - 1); InvokeContextMenu(Self, S, X, Y); end; end; Zur Vollständigkeit hier der "F9" Knopf:
Delphi-Quellcode:
Danke für's Lesen!
// der "F9" Knopf-Code, funktioniert 1A
procedure TMain.BTN_F09Click(Sender: TObject); begin if LeftView.Selected <> nil then ShellExec(LeftShellItem(LeftView.Selected.Index).FullPath, 'properties'); end; function ShellExec(const PIDL: PItemIDList; const Operation: string) : Boolean; overload; var SEI: TShellExecuteInfo; Path: array [0 .. 512] of WideChar; begin Result := False; if SHGetPathFromIDList(PIDL, @Path) then begin FillChar(SEI, SizeOf(SEI), 0); SEI.Wnd := GetActiveWindow(); SEI.cbSize := SizeOf(SEI); SEI.lpFile := PChar(@Path); SEI.lpVerb := PChar(Operation); SEI.fMask := SEE_MASK_INVOKEIDLIST; SEI.nShow := SW_SHOWNORMAL; Result := ShellExecuteEx(@SEI); end; end; Der Anhang ist nur ein Kompilat, ohne Quelltext, da noch mörderisch in Entwicklung. Benutzt wird Delphi Rio. |
AW: windows eigenschaften-dialog für datenträger anzeigen lassen
*stubs an, falls jemand eine Idee hat bitte melden...*
|
AW: windows eigenschaften-dialog für datenträger anzeigen lassen
Für mich sind deine Ausführungen leider verwirrend. Geht es um das Kontextmenü oder um den Eigenschaften-Dialog? In deinem Code kommen beide Dinge vor. Was genau willst du erreichen? Warum das Kontextmenü, wenn der Weg über ShellExecuteEx mit dem Verb properties laut deinem Code einwandfrei funktioniert?
Hast du mal versucht, den Backslash zu belassen?
Delphi-Quellcode:
kann man übrigens auch viel einfacher schreiben:
S := LeftShellItem(LeftView.Selected.Index).FullPath;
if S[Length(S)] = '\' then S := Copy(S, 1, Length(S) - 1);
Delphi-Quellcode:
Aber wie gesagt: ich würd's mal ohne Wegschneiden des Backslashs probieren bzw. mit dem Pfad in deiner Funktion ShellExec vergleichen.
S := ExcludeTrailingPathDelimiter(LeftShellItem(LeftView.Selected.Index).FullPath);
Grüße Dalai |
AW: windows eigenschaften-dialog für datenträger anzeigen lassen
Also, mein Problem sitzt im Kontextmenu.
Es ist ein Teil eines Dateimanagers. Der "F9" Code bezieht sich auf's ShellExec, klappt super. Was wiederum nicht funktioniert ist, wenn ich das Kontextmenu darstellen lasse, ausgehend eines Laufwerks (nicht Datei oder Ordner, da klappt alles), wenn man nun "Eigenschaften" auswählt. Erwartet war das im Endeffekt der "F9" Dialog dargestellt wird, momentan wird nur mein Fallback aufgerufen wo man sich sein System anzeigen lassen kann. Um es nachvollziehen zu können, den Manager starten, rechtsklick auf ein Laufwerk, Eigenschaften auswählen = das von mir beschriebene Problem. ps: Ich hatte es anfangs mit "\" am ende, das mochte das kontextmenu irgendwie nicht. |
AW: windows eigenschaften-dialog für datenträger anzeigen lassen
So langsam verstehe ich. Weil du Teile des Windows-Kontextmenüs anzeigst, musst du dessen Kram benutzen und kannst nicht stattdessen einfach ShellExecuteEx rufen. Es wäre gut gewesen, wenn das aus deinen bisherigen Ausführungen klar(er) hervorgegangen wäre. Ja, ich weiß, hätte hätte ;).
Bei mir öffnet sich beim Klick auf Eigenschaften im Kontextmenü das Fenster mit den Systemeigenschaften. Eine wichtige Sache: Ich rate dir dringend, davon Abstand zu nehmen, Benutzereinstellungen zu ändern! Bei Ausführung deiner EXE hab ich mich sofort gewundert, warum auf einmal die Animation beim Minimieren/Maximieren von Fenstern wieder aktiv ist, und das ist eindeutig auf dein Kompilat zurückzuführen. Es hat seinen Grund, warum ein Nutzer Einstellungen so tätigt, und Programme haben das zu respektieren und nicht daran rumzufummeln - das gilt für (so ziemlich) alle Einstellungen. Zurück zum Thema. Du schriebst, du hast aktuell einen Failsafe eingebaut. Wird denn eine Exception durch das OleCheck ausgelöst oder wird das InvokeCommand des Kontextmenü sauber gerufen? Oder ist das Öffnen der Systemeigenschaften der Failsafe? Grüße Dalai |
AW: windows eigenschaften-dialog für datenträger anzeigen lassen
Zitat:
Zitat:
Es fehlt meinerseits auch noch eine Integration das dieses Menu auch gemalt wird wenn man nicht auf ein Item klickst, kommt noch rein damit es Windows-konformer ist. Zitat:
Diese Zeile Code wird nun definitiv entfernt!! //offtopic Schatteneffekte habe ich auch aktiviert, gilt das auch als Systemeinstellung? Ich hoffe mich so ausgedrückt zu haben das es verständlich(er) ist, ich werde an meiner Formulierung noch arbeiten müssen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 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