AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi windows eigenschaften-dialog für datenträger anzeigen lassen

windows eigenschaften-dialog für datenträger anzeigen lassen

Ein Thema von KodeZwerg · begonnen am 4. Jun 2020 · letzter Beitrag vom 30. Jun 2020
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.457 Beiträge
 
Delphi 5 Professional
 
#11

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 29. Jun 2020, 10:04
Genau das ist mein Failsafe, da beziehe ich mich nicht auf die ItemPIDL sondern auf die FolderPIDL damit er überhaupt etwas darstellen kann.
Löst OleCheck denn eine Exception aus, wenn du den Failsafe weglässt? Wenn ja, was sagt diese? Irgendwas muss ja falsch sein, wenn es nicht funktioniert. Wobei es denkbar ist, dass es auf diesem Weg gar nicht geht, aber das kann ich nicht beurteilen, denn dafür hab ich zu wenig Ahnung von Windows-Kontextmenüs (nahe Null).

Wie groß ist denn Cmd bzw. Cmd-1, wenn das Eigenschaften-Item gerufen wird?

Ich glaube, du solltest das Flag CMIC_MASK_UNICODE nicht setzen. MS schreibt:
Zitat:
CMIC_MASK_UNICODE

The shortcut menu handler should use lpVerbW, lpParametersW, lpDirectoryW, and lpTitleW members instead of their ANSI equivalents.
Die setzt du aber gar nicht. Alternativ kannst du das Flag auch belassen und zusätzlich die angegebenen W-Parameter füllen, solltest dann aber die Struktur TCMInvokeCommandInfoEx statt TCMInvokeCommandInfo nutzen (in der Doku zu letzterem steht nix zum Flag CMIC_MASK_UNICODE).

Zitat:
Puh.... Danke für diese Erkenntnis, ich bin tatsächlich davon ausgegangen das ein aktivieren der Animation nur für mein Programm gilt, auch nur solange es läuft und nicht das dadurch Systemeinstellungen gesetzt werden.
Nun, die Funktion heißt SystemParametersInfo, nicht ProgramParametersInfo.

Zitat:
Schatteneffekte habe ich auch aktiviert, gilt das auch als Systemeinstellung?
Hier gilt dasselbe. Ist mir nur nicht aufgefallen, weil die bei mir eh aktiviert sind. Wäre das nicht so, hätte ich das ebenfalls angemerkt.

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.397 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 29. Jun 2020, 11:35
Danke für die Anregung mit dem Unicode Flag, das werde ich nachher mal testen und erstelle auch ein paar Photos (bevor ich mich falsch Ausdrücke) was passiert wenn man ohne Failsafe arbeitet.
Ich werde erst morgen die offenen Fragen beantworten können, bitte sei mir nicht böse und Dankeschön nochmal!
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.397 Beiträge
 
Delphi 10.3 Rio
 
#13

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 30. Jun 2020, 07:30
Guten Morgen/Tag/Abend,

hier nun nochmal umgeschrieben so das mir Windows auch was dazu sagen kann...

Delphi-Quellcode:
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;
  ContextMenu: IContextMenu;
  ContextMenu2: IContextMenu2;
  Menu: HMENU;
  Pos: TPoint;
  Cmd: DWORD;
  CommandInfo: TCMInvokeCommandInfo;
begin
  OleCheck(SHGetDesktopFolder(DeskFolder));
  Attributes := 0;
  OleCheck(DeskFolder.ParseDisplayName(Handle, nil,
                    PWideChar(WideString(ExtractFilePath(Path))),
                    Eaten, FolderpIdl, Attributes));
  OleCheck(DeskFolder.BindToObject(FolderpIdl, nil, IID_IShellFolder, Folder));
  CoTaskMemFree(FolderpIdl);
  Attributes := 0;

(*

An dieser Stelle kommt Windows mit meiner Anfrage für Wurzelpfade nicht mehr weiter.

ExtractFileName(Path) hab ich mit 'C', 'C:', 'C:\' ausgetauscht um halt das Wurzelverzeichniss zu erhalten.
Das mag der so gar nicht als Wert haben wollen.
Entweder kommt ein Fehlerfenster mit Inhalt: "Falscher Parameter" oder "Das System kann die angegebene Datei nicht finden.

*)


  OleCheck(Folder.ParseDisplayName(INVALID_HANDLE_VALUE, nil,
            PWideChar(WideString(ExtractFileName(Path))), Eaten, PIDL, Attributes));

  OleCheck(Folder.GetUIObjectOf(Handle, 1, pIdl, IID_IContextMenu,
                                  nil, ContextMenu));
  CoTaskMemFree(pIdl);
  Menu := CreatePopupMenu;
  try
    OleCheck(ContextMenu.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE));
    ContextMenu.QueryInterface(IID_IContextMenu2, ContextMenu2);
    try
      Pos.X := X;
      Pos.Y := Y;
      Winapi.Windows.ClientToScreen(Owner.Handle, Pos);
      Bool(Cmd) := TrackPopupMenu(Menu,
                            TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD,
                            Pos.X, Pos.Y, 0, Handle, nil);
    finally
      ContextMenu2 := nil;
    end;
    if Bool(Cmd) then begin
      FillChar(CommandInfo, SizeOf(CommandInfo), 0);
      CommandInfo.cbSize := SizeOf(CommandInfo);
      CommandInfo.hwnd := Handle;
      CommandInfo.lpVerb := PAnsiChar(MakeIntResource(Cmd - 1));
      CommandInfo.nShow := SW_SHOWNORMAL;
      OleCheck(ContextMenu.InvokeCommand(CommandInfo));
    end;
  finally
    DestroyMenu(Menu);
  end;
end;
Cmd Variable hat bei mir vom Menupunkt "Eigenschaften" immer den Wert 20. (Also 20-1 = 19)

Anbei noch mal ein aktuelleres Kompilat wo nun auch ein Menu gemalt wird wenn man nichts ausgewählt hat.
Der obige Code ist dort verbaut.
Animationscode wurde entfernt, Schattencode betrifft nur meine Anwendung (DropShadow).

Die Fotos, das mit "Falscher Parameter" entstammt dem obigen Code, das mit dem bösen Fehler entstammt den alten Code wenn ich meine Sicherheitsabfragen entferne.
Miniaturansicht angehängter Grafiken
screenshot-30_06.png   screenshot-29_06.png  
Angehängte Dateien
Dateityp: 7z FSx64.7z (872,0 KB, 1x aufgerufen)
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.457 Beiträge
 
Delphi 5 Professional
 
#14

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 30. Jun 2020, 07:43
Aus Interesse hab ich gestern deinen Code übernommen, etwas abgeändert, und damit rumgespielt. Wahrscheinlich kannst du auf die ganze relative Pfad-Geschichte - und damit die doppelte IShellFolder-Variable - verzichten, denn MS schreibt zu ParseDisplayName:
Zitat:
pszDisplayName

Type: LPWSTR

[...] The desktop folder, for instance, accepts paths such as "C:\My Docs\My File.txt".
Leider führte mich dieses Detail auch nicht weiter. Bei mir öffnet sich ebenfalls nur das Fenster mit den Systemeigenschaften, oder ich bekomme beim OleCheck ebenfalls "Falscher Parameter". Welcher Parameter da falsch sein soll, entzieht sich mir... Hätte ich mehr Ahnung in Bezug auf diese konkreten Interfaces und/oder die Kontextmenüs, oder hätte die selbst schon mal benutzt, könnte ich vielleicht helfen .

PS: Übrigens kannst du auf die Variablen Eaten und Attributes verzichten, wenn du stattdessen Cardinal(nil^) als Parameter reingibst (sofern du deren Werte nicht benötigst).

Grüße
Dalai

Geändert von Dalai (30. Jun 2020 um 07:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.397 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 30. Jun 2020, 09:19
Bloß keine falsche Bescheidenheit, selbst wenn mein Eigentliches Problem immer noch da ist hast Du mir dennoch an anderer Stelle super weitergeholfen (Animation) und Tipps mit Umgang!
Ach ich liebe das Forum
Deine Anregung den "DeskFolder" nicht zu nutzen, da komme ich gerade noch nicht ganz klar. So wie ich die MS-Docs da verstanden hatte leiten sich alle PIDLs davon ab, was ja auch funktioniert hat. Vielleicht habe ich Dich da auch missverstanden.
Wenn es keine Umstände bereitet, könntest Du mir bitte Deine Änderung zeigen?
Die ungenutzten Variablen bleiben ungenutzt, soll heißen auf "Cardinal(nil^)" werde ich umstellen. Dankeschön!
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.457 Beiträge
 
Delphi 5 Professional
 
#16

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 30. Jun 2020, 12:15
Deine Anregung den "DeskFolder" nicht zu nutzen, da komme ich gerade noch nicht ganz klar. So wie ich die MS-Docs da verstanden hatte leiten sich alle PIDLs davon ab, was ja auch funktioniert hat. Vielleicht habe ich Dich da auch missverstanden.
OK, ich erkläre es mal anders. Bisher extrahierst du ja den Pfad des übergebenen Dateinamens, parst diesen und bindest ihn an die Variable DeskFolder. Anschließend machst du das gleiche mit dem reinen Dateinamen und der Variable Folder. Du nutzt also zweimal je ein IShellFolder Interface, und einen Dateinamen relativ zu seinem Pfad. Laut MS KB-Artikel soll ParseDisplayName - so mein Verständnis des zitierten Teils - auch mit absoluten Pfaden klarkommen, wenn man ihn mit dem Desktop-Verzeichnis füttert. Es sollte also ausreichen, wenn du eine Instanz von IShellFolder nutzt (DeskFolder) und dort gleich den vollen Pfad reinpackst und parsen lässt.

Ich hoffe, das war ausreichend klar erklärt. In meinen Änderungen hab ich sozusagen komplett auf die Variable Folder verzichtet (zum Test erstmal nur im Falle/Abschnitt des "Failsafes") und stattdessen DeskFolder verwendet.

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.397 Beiträge
 
Delphi 10.3 Rio
 
#17

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 30. Jun 2020, 13:16
Joah, die zweite, tiefere, andere, whatever :-] Erklärung hat mich erleuchtet, ich hatte verkehrt herum gedacht.
Ich werde es mal durchtesten wie Du beschrieben hast bzw eine dritte Variante die mir gerade beim Lesen/Schreiben in den Sinn gekommen ist.
Lösen wird was ich gerade im Hinterstübchen habe auch nicht mein Problem, aber der Gedanke Ballast loszuwerden ist immer Lobenswert
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
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 01:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf