Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Explorer-Kontextmenüpunkt unsichtbar ausführen (https://www.delphipraxis.net/186217-explorer-kontextmenuepunkt-unsichtbar-ausfuehren.html)

einbeliebigername 17. Aug 2015 17:02

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen
 
Hallo,

habe mir den Code jetzt nicht richtig angesehen, aber denke
Delphi-Quellcode:
  aPopup := CreatePopUpMenu;

erzeugt das Menu,
Delphi-Quellcode:
  OLECheck(aContextMenu.QueryContextMenu(aPopup, 0, 1, $7FFF, CMF_EXPLORE or CMF_CANRENAME));

füllt das Menu mit Inhalt und
Delphi-Quellcode:
   aCmd := Integer(TrackPopupMenu(aPopup, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD, X, Y, 0, Handle, nil));

zeigt es an.

Eine Suche mit MSDN und CreatePopUpMenu brachte mich indirekt zu https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx. Dort sind so interessante Funktionen wie GetMenuItemCount und GetMenuString aufgeführt. Ich würde statt TrackPopupMenu mal mit diesen rumspielen. Zu klären wäre noch was TrackPopupMenu genau (ID oder Index) zurückgibt. Aber das sollte in der Doku stehen.

einbeliebigername.

Luckie 17. Aug 2015 17:58

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen
 
Und WAS macht der Eintrag, der ausgeführt werden soll?

CodeX 18. Aug 2015 00:04

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen
 
@einbeliebigername
Vielen Dank für die Hilfe! Ich habe die Funktionen dazu zwar auch schon gefunden, aber irgendwie habe ich es trotzdem nicht zum Laufen bekommen. Ich habe in der Zwischenzeit jedoch eine wesentlich einfachere Möglichkeit über die Jcl gefunden, die intern wohl einfach viel der Shell-Programmierung abnimmt:
Delphi-Quellcode:
  ItemIdList := PathToPidlBind('Z:\', Folder);
  if ItemIdList <> nil then
  begin
    InvokeContextMenuCommand(37, Folder, ItemIdList); //37 ist die ID vom benötigten Menüpunkt
    PidlFree(ItemIdList);
  end;
Damit wird die Funktion aus dem Kontextmenü korrekt aufgerufen.
Allerdings bin ich nun sehr ratlos, denn das Ergebnis ist etwas anders als wenn man es mit der Maus anklickt ... und zwar mit genau dem gleichen Problem wie per API. :shock:

Ich habe mich deshalb entschlossen, doch das eigentliche Problem sauber aufzubereiten und als gesonderte Frage zu stellen.

Zitat:

Zitat von Sir Rufo (Beitrag 1312153)
Was für einen Menü-Eintrag - was für einen Aktion - soll denn ausgeführt werden? Meistens gibt es einen ganz anderen Weg dahin.

Zitat:

Zitat von Luckie (Beitrag 1312456)
Und WAS macht der Eintrag, der ausgeführt werden soll?

Trommelwirbel ... ein Netzlaufwerk trennen.
Was? So einfach? Naja, nicht ganz. Aber seht selbst:
http://www.delphipraxis.net/186253-w...gesucht-*.html

Wenn mir jemand erklären kann, warum der Kontextmenüaufruf per Code ein anderes Resultat hat als per Maus oder einen konkreten Lösungsansatz für das eigentliche Problem hat, wäre ich sehr dankbar. Ich hänge da jetzt bereits seit etwa einer Woche dran und kann mich einfach nicht damit abfinden, dass es da keine Lösung dafür zu geben scheint. :(

CodeX 23. Aug 2015 14:29

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen
 
Ich sehe das simulierte Anklicken des Kontextmenüpunktes aktuell als einzige Möglichkeit, das Problem zu lösen (siehe http://www.delphipraxis.net/186253-w...gesucht-*.html).
Allerdings ist das Ergebnis per IContextMenu oder per CoShell (was ich zwischenzeitlich alternativ ausprobiert habe) ja ebenfalls unzureichend.
Solange man darüber anscheinend nicht exakt im Kontext des Explorers arbeitet, wäre der einzige andere Weg, ein Explorerfenster zu öffenen, sich durch dessen Bestandteile/Komponenten per simulierter Tastendrücke durchzuhangeln und die Aktion so auszulösen.
Das habe ich nun per EnumWindows versucht, allerdings sind die Laufwerksicons keine Windows, sodass ich nicht so recht weiß, wie man da am besten dran kommt. Alternativ kann ich den Explorer in einem neuen Prozess so öffnen, dass das gewünschte Laufwerk bereits selektiert ist:
Code:
'explorer.exe /n,/e,/select,"Z:"'
ProcessId und Fensterhandle habe ich davon anschließend auch.
Nun weiß ich nicht so recht, wie weiter. Kontextmenü öffnen und ein paar mal nach unten drücken bis "Trennen" selektiert ist und "Enter" senden? Würde gehen, wenn ich den selektierten Kontextmenüpunkt irgendwie auslesen könnte (das Kontextmenü kann ja überall anders aussehen).
Ist das möglich?
Oder kann man alternattiv eine Funktion exakt so ausführen, als hätte sie ein anderer Prozess gestartet?

Luckie 23. Aug 2015 15:49

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen
 
Der Dialog wird auch nichts anderes machen als http://www.delphipraxis.net/29982-ne...n-trennen.html

CodeX 23. Aug 2015 16:02

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen
 
Zitat:

Zitat von Luckie (Beitrag 1313136)
Der Dialog wird auch nichts anderes machen als http://www.delphipraxis.net/29982-ne...n-trennen.html

Hast du denn meine Ausführungen überhaupt nicht gelesen? :?
Ich habe diesen Thread auf deine Frage hin erstellt: http://www.delphipraxis.net/186253-w...gesucht-*.html
Das Verhalten ist eben ein anderes, wenn man das Laufwerk per Kontextmenü im Explorer trennt als wenn man irgendeine andere Möglichkeit verwendet (WNetCancelConnection2, net use, Windows Dialog "Netzlaufwerk trennen", etc.)...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 Uhr.
Seite 2 von 2     12   

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