mercoledì 6 maggio 2009

Comunicare con un Addin di tipo Background

mi sono imbattuto nella gestione dei messaggi per un addin di backgroung su windows media center.
il problema era creare una finestra che per l'addin non esiste ed un handle cui inviare i messaggi da gestire opportunamente
creare una finestra e gestire i messaggi è semplice e si fa nel seguente modi:
nella classe principale dell'addin quella che contiene il metodo Launch()
inserire il seguente codice:
protected override void WndProc(ref Message m){ if (m.Msg == WM_COPYDATA) { ... } base.WndProc(ref m);}
per creare un titolo di finestra che le altre applicazioni possono trovare e a cui inviare poi i messaggi
si fa nel seguente modo:
public mceDialogAddIn(){ //Creating Window based on globally known name, and create handle //so we can start listening to Window Messages. CreateParams Params = new CreateParams(); Params.Caption = ""; this.CreateHandle(Params);}

dove mceDialogAddIn è il costruttore della classe principale dell'addin, quella che contiene il metodo launch.
il problema principale da parte dell'addin è quello di ricevere i messaggi e fare il dispach in modo che
la procedura di gestione dei messaggi li possa ricevere e gestire (la WndProc)
//codice per trovare la finestra dell'addin creata.hwndTarget = FindWindow(vbNullString, "")
per fare questo nel metodo launch() che non deve terminare mai se si vuole che l'addin resti in vita
quando il mediacenter è in esecuzione, bisogna includere il seguente codice alla fine della funzione:
void IAddInEntryPoint.Launch(AddInHost host){ ... while (true) { // Yield processing till we sample for inactivity // if we let the execution exit "Launch", // the addin will be unloaded // and is then unable to get messages... Thread.Sleep(100); System.Windows.Forms.Application.DoEvents(); }}
tutto questo su :http://www.codeproject.com/KB/dotnet/mceexternaldialog.aspx?display=Print