8
votes

Comment contempler le menu contextuel Windows pour un fichier donné à l'aide de Delphi?

Je veux écrire la procédure / fonction suivante: xxx

qui va construire et montrer (sur les coordonnées x et y) le menu shell cliquant avec le bouton droit de la souris que l'on voit dans l'explorateur Windows pour le fichier donné. Je ne suis pas si intéressé par la partie "Afficher" mais plus dans la façon dont on peut construire un tel menu.


0 commentaires

3 Réponses :


2
votes

Êtes-vous sûr que c'est ce que vous voulez faire? Parce que si vous le faites, vous allez effectivement devoir reproduire tout le code dans la coque de Windows et tout ce qu'il s'agit du comportement et des interactions avec une multitude de code.

Le menu contextuel est essentiellement construit par "extensions de coque". Celles-ci sont enregistrées de COM DLL au système. Lorsque le menu contextuel est invoqué, le shell suit un ensemble de règles qui déterminent où il devrait regarder (dans le registre) pour des dll d'extension.

J'ai trouvé que ceci est un guide utile sur ces règles .

Mais trouver la dll d'extension n'est même pas la moitié de l'histoire. Pour chaque DLL, la coquille instantirait alors l'objet COM enregistré par cette DLL et appelle les appels à ces objets que la DLL répond à la configuration ou à l'appel des commandes de menu.

La coquille elle-même ne construit pas le menu, ni l'information requise pour créer le menu disponible pour être interrogée ou lue directement à partir de n'importe où - le menu est construit entièrement de manière entièrement dynamique par les extensions de coque.

La coque passe une poignée au menu à chaque extension, ainsi que quelques informations racontant l'extension de l'ID de commande qu'il doit utiliser pour tous les éléments qu'il ajoute à ce menu. L'extension peut ajouter à peu près tout ce qu'il aime que la poignée de menu est donnée, y compris des sous-menus, etc., et il peut bien ajouter différents éléments en fonction des propriétés du fichier actuel Sélectionner, non seulement des extensions de fichier (par exemple, le client de Tortoise SVN ajoute. Différents éléments de menu en fonction de ce qui est pertinent pour le statut SVN actuel de ces fichiers).

Donc, si vous voulez construire un tel menu vous-même, comme je le disais, vous devrez reproduire l'ensemble du cadre d'extension de shell (ou au moins ces parties de celui-ci qui initialisent le menu, en supposant une raison pour une raison quelconque vouloir ou besoin d'appeler les commandes de menu elles-mêmes) dans votre propre code.

Cela pourrait peut-être aider si vous expliquez pourquoi vous souhaitez faire cela et ce que vous essayez d'atteindre. Il pourrait y avoir un moyen plus facile d'y aller.


1 commentaires

On dirait qu'il peut y avoir un moyen de le faire sans reproduire tout ce code shell après tout. J'ai trouvé cela mais c'est un exemple .NET. andrewvos.com/?p=420



0
votes

Bien que je suis d'accord avec Deltics, il est beaucoup de travail, les informations requises pour la plupart (sinon toutes) des articles sont librement disponibles dans le registre. Le guide indiqué dans Deltics Répondez bien et vous donnera la plupart des articles. On peut rechercher des entrées de base dans le registre, alors que d'autres ont besoin d'appels vers des objets COM.


0 commentaires

17
votes

J'ai fait une solution rapide pour vous. Ajoutez ces unités à la section "Utilisations": xxx pré>

et voici votre procédure, j'ajouterai simplement un nouveau paramètre "HND" pour transporter la poignée du TwinContrôle que vous utiliserez pour afficher le contexte MENU. P>

procedure TForm2.Button1Click(Sender: TObject);
begin
  ShowSysPopup(Edit1.Text,Edit1.Left,Edit1.Top, Handle);
end;


5 commentaires

Cela semble un peu incomplet, iContextMenu2 Les messages ne sont pas manipulés, c'est-à-dire que Handlemenumsg n'est pas appelé en réponse aux messages de menu. En conséquence, certains sous-menus (comme le «ouvert avec») ne seront pas peuplés. ici est un exemple de ce dont je parle.


De plus, sans classe implémentant l'interface ISHELLCOMMANDVERB, votre paramètre Boolean 'Manipulé' et l'interface elle-même ne sert rien. Comme vous pouvez le constater dans votre code, vous interrogez nil s'il prend en charge l'interface, vous n'avez bien sûr que vous n'avez jamais donné l'interface, viennent de vous débarrasser de ce lot de code inutile et de la déclaration de type inutile .


J'ai pris la liberté de le faire moi-même. Cette déclaration si supporte (NIL, ISHELLCOMMANDVERB, SCV), alors était vraiment debout. S'il vous plaît, corrigez également le code sur votre blog .. Mon premier commentaire reste toujours valable.


Quand edit1.text: = 'c: \' a échoué


Impossible de contempler 'Partager avec' article