Intercettare click sul pulsante di riduzione ad icona del form!

lunedì 02 febbraio 2009 - 21.08

Francesco14DIC88RC Profilo | Newbie

Ciao a tutti,
Avrei bisogno di sapere come bisogna intercettare il click sul pulsante di riduzione ad icona.
Ho gia provato questo codice:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Il problema è che non voglio che si riduca ad icona ma esegua solo il codice che è contenuto dentro l'if.
Un po come succede con il pulsante X, per chiudere!
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Si può risolvere questo problema?

aiedail92 Profilo | Expert

Ciao

Per fare un lavoro del genere devi eseguire l'override della funzione WndProc della tua Form. Lì vengono mandati tutti i messaggi di Windows, e quello è il fulcro della grafica di ogni applicazione basata su finestre. A questo punto devi solo intercettare il messaggio corretto (WM_SYSCOMMAND), verificare che il mouse sia sul pulsante di riduzione ad icona, e quindi fare quello che devi fare.

Un esempio chiarisce meglio di mille parole :

Const WM_SYSCOMMAND As Integer = &H112 Const SC_MINIMIZE As Integer = &HF020 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 'Se il messaggio avvisa della pressione di un tasto nell'area 'dei comandi, e il tasto è proprio quello di riduzione ad icona... If m.Msg = WM_SYSCOMMAND AndAlso m.WParam = SC_MINIMIZE Then 'Esegue quello che vuoi fare MessageBox.Show("Riduzione ad icona!") 'Se l'applicazione processa il messaggio, deve ritornare 0 m.Result = 0 Else 'Altrimenti devi ricordarti di chiamare la funzione predefinita MyBase.WndProc(m) End If End Sub

Luca

alexmed Profilo | Guru

Ciao
Anch'io qualche tempo fà avevo fatto la stessa richiesta ma non avendo avuto risposta mi sono inventato questo:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=27795

Spero ti possa aiutare

Ciao
alexmed

[Come non detto]

Francesco14DIC88RC Profilo | Newbie

Grazie a tutti! Era un po che mi spremevo il cervello per risolvere questa cosa!

Ma ora mi chiedo, tutte queste funzioni cosi, dove le posso trovare? Non ce niente che spiega come si usano!
Mi sto rendendo conto solo adesso che sono essenziali e le vorrei imparare!

Anonimo Profilo | Senior Member

>Si può risolvere questo problema?

Certo!
Prova questo codice

public partial class Form1 : Form { private const int WM_SYSCOMMAND = 0x0112; private const int SC_MINIMIZE = 0xf020; protected override void WndProc(ref Message m) { if (m.Msg == WM_SYSCOMMAND) { if (m.WParam.ToInt32() == SC_MINIMIZE) { MessageBox.Show("Non puoi minimizare il form!"); m.Result = IntPtr.Zero; return; } } base.WndProc(ref m); } }

Ciao ciao!

EDIT: Scusate, mentre testavo la funzione hanno risposto al topic

Riccardo

aiedail92 Profilo | Expert

La docmentazione la trovi tutta su MSDN online, per quanto riguarda le API di Windows però troverai praticamente solo informazioni in inglese...

Se non devi scrivere codice in C\C++ non gestito, generalmente c'è poco bisogno di usarle, il Framework provvede quasi sempre a tutto (anche se con grandi perdite nelle prestazioni), e le poche volte che c'è bisogno di qualcosa di non gestito... beh siamo qui per questo no?

Comunque se vuoi dare un'occhiata qui: http://msdn.microsoft.com/en-us/library/ms632595.aspx e su tutto il ramo, ci sono tutte le funzioni per l'utilizzo delle finestre e tutti i messaggi comuni per le finestre di Windows con relativa documentazione.

Come ti ho detto è tutto in lingua inglese, comunque se hai dubbi o necessiti di altre informazioni ti basta chiedere

Luca

Francesco14DIC88RC Profilo | Newbie

Ok sempre utilissimi! :)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5