Per impedire all'utente di interagire con le operazioni del programma, a volte bisogna disabilitare alcune opzioni di controllo presenti all'interno della finestra dell'applicazione che si sta sviluppando; ad esempio, disabilitare l'opzione di chiusura, che si trova in alto a destra nelle finestre di dialogo, dei sistemi di casa Microsoft, allo scopo di evitare un'interruzione non prevista.
Per effettuare un'
operazione di questo tipo, occorre impiegare un insieme di
procedure disponibili grazie all'interfaccia offerta dalle
API di Windows, che permettano di effettuare un
trap degli eventi, a un livello più basso di quello applicativo; così facendo, è possibile impedire la ricezione del segnale di interruzione del processo in corso.
Se si sta utilizzando il
framework .NET, come prima cosa, bisognerà aggiungere, al proprio spazio di lavoro, il namespace
System.Runtime.InteropServices, che supporta la gestione e la comunicazione tra i processi e i servizi attivi del sistema operativo. In seguito, si fa ricorso alle
chiamate:
[DllImport("User32")]private static extern int RemoveMenu(IntPtr Menu, int posizione, int flag);
[DllImport("User32")]private static extern IntPtr GetSystemMenu(IntPtr Menu, int revert);
[DllImport("User32")]private static extern int GetMenuItemCount(IntPtr Menu);
[DllImport("User32")]private static extern int DrawMenuBar(IntPtr finestra_di_dialogo);
La prima viene impiegata per eliminare un oggetto da un menu nella posizione specificata; la seconda chiamata serve a ottenere un
handler di un determinato menu, mentre la terza ne conta il numero di oggetti presenti. L'ultima
chiamata è utilizzata per ridisegnare il nuovo menu in seguito alle modifiche apportate.
A questo punto, disabilitare, a tutti gli effetti, la funzione di chiusura dell'applicazione diventa molto semplice: basta rilevare l'indirizzo del menu, contarne gli oggetti, rimuovere quello a cui si è interessati e inviarlo nuovamente al sistema per farlo visualizzare.
IntPtr Menu = GetSystemMenu(this.Handle, false);
int numero_oggetti = GetMenuItemCount(Menu);
RemoveMenu(Menu, numero_oggetti - 1, disable | remove);
DrawMenuBar(this.Handle);