AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Explorer-Kontextmenüpunkt unsichtbar ausführen
Thema durchsuchen
Ansicht
Themen-Optionen

Explorer-Kontextmenüpunkt unsichtbar ausführen

Ein Thema von CodeX · begonnen am 14. Aug 2015 · letzter Beitrag vom 23. Aug 2015
Antwort Antwort
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen

  Alt 14. Aug 2015, 17:18
Da ich mit der Materie nicht so vertraut bin, habe ich mal bei MSDN nachgeschaut:
Zitat:
Methods

The IContextMenu interface has these methods.


Method

Description

GetCommandString
Gets information about a shortcut menu command, including the help string and the language-independent, or canonical, name for the command.

InvokeCommand
Carries out the command associated with a shortcut menu item.

QueryContextMenu
Adds commands to a shortcut menu.


Das InvokeCommand sollte doch sein was Du willst? oder hab ich das falsch verstanden?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#2

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen

  Alt 14. Aug 2015, 21:33
Das InvokeCommand sollte doch sein was Du willst? oder hab ich das falsch verstanden?
Ja, das stimmt schon. Aber ich muss zugeben, dass ich diese Shell-Programmierung teilweise nicht so ganz verstehe. Deshalb komme ich leider auch nicht drauf, wie ich von dem IContextMenu das gewünschte Item zum Ausführen finde.

Nach OLECheck(ShellFolder.GetUIObjectOf(0, 1, PIDL, IID_IContextMenu, aPrgOut, Pointer(aContextMenu))); ist das Kontextmenü in aContextMenu drin. Aber nun muss ich da noch irgendie durchiterieren und den gewünschten Eintrag finden (anhand vom Text oder irgendeiner ID). Danach kann ich das ausführen.

Aber letztendlich soll doch was passieren und zwar mehr als nur das Kontextmenü aufklappen zu lassen.
Wie gesagt: Nur finden, nicht aufklappen. Dann einen Eintrag davon ausführen. Genau so als hätte man das händisch getan.
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen

  Alt 17. Aug 2015, 17:58
Und WAS macht der Eintrag, der ausgeführt werden soll?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#4

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen

  Alt 18. Aug 2015, 00:04
@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.

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

Was für einen Menü-Eintrag - was für einen Aktion - soll denn ausgeführt werden? Meistens gibt es einen ganz anderen Weg dahin.
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.
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#5

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen

  Alt 23. Aug 2015, 14:29
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?
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen

  Alt 23. Aug 2015, 15:49
Der Dialog wird auch nichts anderes machen als http://www.delphipraxis.net/29982-ne...n-trennen.html
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#7

AW: Explorer-Kontextmenüpunkt unsichtbar ausführen

  Alt 23. Aug 2015, 16:02
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.)...
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:24 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