Tips&Tricks I trucchi del mestiere

 

Nascondere il menu contestuale dei filmati Macromedia Flash di una Windows Forms

Il tip in linguaggio C# spiega come inserire un filmato Macromedia Flash in una applicazione windows .NET e nasconderne completamente il menu contestuale.
Tip fornito dal Sig. Sergio Turolla
Come prima operazione, utilizzando l'applicazione "aximp" fornita a corredo con l'SDK del Framework .NETm si importa l'activeX di Flash utilizzando la seguente sintassi:

aximp "c:\WINDOWS\system32\Macromed\Flash\Flash.ocx" /source

(NB: Si presuppone che il player Flash 6 sia correttametne installato nella sua path di default ("c:\WINDOWS\system32\Macromed\Flash\Flash.ocx", se non Φ cosi lo si puo scaricare dal sito della macromedia "www.macromedia.com")
Saranno generati tre file di cui solo due necessari ai nostri scopi: "ShockwaveFlashObjects.dll" e soprattutto "AxShockwaveFlashObjects.cs" (il sorgente del wrapper .NET per l'activeX di flash)
Successivamente editando il file "AxShockwaveFlashObjects.cs" generato automaticamente dall'utility "aximp" si deve aggiungere il seguente codice alla classe AxShockwaveFlash:

public class AxShockwaveFlash : System.Windows.Forms.AxHost {

// Costante dell'evento da intercettare
		private readonly int rightMouseClickMessage = 516;

		// Disabilita il menu contestuale
		protected override void WndProc(ref System.Windows.Forms.Message m)
		{			
			// Intercetta ed esegue tutti i messaggi tranne 
// quello del tasto destro del mouse che causa la 
// visualizzazione del menu contestuale
			if (m.Msg != rightMouseClickMessage)
				base.WndProc(ref m);		
		}
...
...

Questo codice fa si che vengano intercettati e gestiti, dal componente Flash, tutti i messaggi ad eccezione di quello generato dalla pressione del tasto destro del mouse. In questo modo il player Flash, non ricevendo mai il messaggio di Windows, che lo informa della pressione del tasto destro del mouse, inibisce la visualizzazione del menu contestuale associato all'evento. E' ora possibile utilizzare la classe all'interno dei nostri applicativi Windows Forms, ad esempio in questo modo:

using System;
using System.Drawing;
using System.Windows.Forms;
using AxShockwaveFlashObjects;

namespace FlashTest
{
	public class FlashForm  : System.Windows.Forms.Form
	{

		private AxShockwaveFlash flashControl;

		public FlashForm ()
		{
			this.Text = "FlashTest";
			this.Size = new Size(500,400);
			this.Load += new EventHandler(this.myWindow_Load);

			// crea il controllo flash e lo aggiung al form
			this.flashControl = new AxShockwaveFlash();
			this.flashControl.Location = new Point(10,10);
			this.flashControl.Size = new Size(300,300);
			this.Controls.Add(this.flashControl);

		}

		public void myWindow_Load(object sender,EventArgs e)
		{
			// Carica il filmato flash
			// Per un corretto funzionamento caricare il filmato
			// sempre sull'evento Load del form o successivamente
	// e mai nel costruttore			
this.flashControl.Movie = 
System.IO.Path.Combine(Application.StartupPath,"Login.swf");
		}

		public static void Main()
		{
			Application.Run(new FlashForm());
		}
	}
}

In ultimo, per compilare l'applicativo, bisogna ricordarsi di aggiungere un riferimento al file "ShockwaveFlashObjects.dll" generato da "aximp", ad esempio eseguire:

csc /target:winexe FlashForm.cs AxShockwaveFlashObjects.cs /r:ShockwaveFlashObjects.dll