Newsgroup: it.comp.lang.c++
Titolo: popup di windows

salve,
come si fa ad inserire una voce nel menu' di popup di windows?
grazie per l'aiuto

come si fa ad inserire una voce nel menu' di popup di windows?
Dipende di QUALE "menu di popup" tu parli -- ce ne sono
parecchi!  Ad esempio, il contenuto del menu di popup che
appare quando clicchi su "Start" nell'Application Bar dipende
da quel che si trova in vari directory del tuo disco, zone della
tua registry, ecc.
La maggior parte dei "menu di contesto" (menu di popup
che appaiono cliccando il tasto destro del mouse con il
puntatore su di un nome di file) sono controllati dallo Shell
di Windows, e per estenderli (inserire una o piú voci) si
implementa una "shell extension".  In certi casi questo
puó essere fatto assai semplicemente e senza scrivere
alcun codice, ad esempio con Windows Explorer (in
italiano mi pare si chiami "gestione risorse") col menu
View/Folder Options/File Types, scegli l'estensione che
ti interessa e Edit..., oppure New Type... per una non
ancora presente (spiacente, non ricordo a memoria
l'equivalente italiano o per vecchie versioni, comunque
la funzionalitá c'é da un pezzo).
Se questo vuoi farlo da programma, invece che in modo
interattivo, devi, sostanzialmente, modificare la registry
(fare SEMPRE un backup prima di iniziare a sperimentare
con la registry -- una registry accidentalmente danneggiata
puó essere un DISASTRO!!!).  Puoi esaminare l'attuale
struttura, ad esempio, dei menu di popup di contesto che
corrispondono ai vari file extensioni (quelli che in modo
interattivo puoi editare con la procedura di cui sopra) con
REGEDIT (o REGEDT32).
Comunque ciascuno di questi sotto-argomenti é lungo,
quindi, se ci chiarisci esattamente cosa ti serve, forse
possiamo darti ulteriori chiarimenti.
Alex

 tua registry, ecc.
ciao,volevo un aiuto ad interpretare questa voce del Win32 Programming
Techniques:
Context Menu Extensions
--------------------------
When the user clicks mouse button 2 on an item within the shell's
namespace (that is,
file, directory, server, work group, and so on), it creates the default
context menu for
the type of item and then loads context menu extensions that are
registered for the type
(and its base type) so that they can add extra menu items. The context
menu extensions
are registered at the following location.
HKCR\{ProgID}\shellex\ContextMenuHandlers
l'esempio piu' simile a cio' che mi serve e' il menu del winzip...
grazie
massimo

HKCR\{ProgID}\shellex\ContextMenuHandlers
Infatti vedi, ad esempio, con REGEDT32 (o REGEDIT), sotto
HKEY_CLASSES_ROOT (normalmente abbreviata come HKCR),
troverai varie sottochiavi ContextMenuHandlers di sottochiavi
shellex che indicano le class-ID (COM; una volta si diceva OLE)
da usare come estensioni del context menu.  La cosa piu' chiara
puo' essere quella di studiarti l'esempio ShellExt che si downloada
come parte del Windows Platform SDK (e' anche incluso in Visual
Studio, e mi pare anche in VC++).
Comunque, in sostanza: la cosa fondamentale per qualsiasi
estensione di shell e' registrarsi correttamente nella registry.
La sua Globally Unique ID (GUID), che puoi generare ad es.
con GUIDGEN, deve essere immessa fra le sottochiavi della
sottochiave CLSID di HKCR, e a sua volta avere una sottochiave
InProcServer32 che da' la path completa alla DLL con cui essa
implementa l'opportuno server in-process (puoi anche usare un
server out-of-process, cioe' un'EXE, e persino un server remoto,
via DCOM, ma NON te lo consiglio per ragioni di prestazioni!!!).
La GUID poi sara' usata come valore delle sottochiavi dei vari
ContextMenuHandlers di shellex -- compreso quello della chiave
"*" (il nome e' solo asterisco, senza le virgolette), che e' usata
per tutti i file qualsiasi sia la loro estensione.
In Windows NT, inoltre, la CLSID dell'estesione di shell deve
anche essere elencata (sempre nella registry) fra le sottochiavi
di un lungo percorso (a memoria non lo ricordo, ma posso
ritrovarlo nelle doc se ti serve -- l'ultima sottochiave e'
"Approved", e il formato in cui si aggiunge e' quello di usare
la CLSID come sottochiave, il ProgId come suo valore).
Il tuo servente COM (normalmente in-process) cosi' accuratamente
registrato deve implementare l'interfaccia COM IShellExtInit, cosi'
che lo shell possa inizializzarlo quando lo carica.  Un context menu
handler, specificamente, deve poi implementare IContextMenu,
altra interfaccia COM definita dalla shell.
E poi la gente si stupisce quando dico che, al giorno d'oggi, fare
un'applicazione Windows significa sostanzialmente fare una
applicazione COM...:-).
Una breve introduzione generica alle problematiche di COM, e
alcune di quelle ad esso periferiche, si trova (in inglese) sul mio
sito Web, url: 
http://magenta.com/~alex/ComEtc/briefest.htm
.
Alex