Attualmente sto lavorando a un componente aggiuntivo C# .NET per Microsoft Outlook. L'obiettivo del componente aggiuntivo è, per acquisire l'input di ricerca da Ricerca istantanea di Outlook, e mostrare in un riquadro personalizzato i risultati della ricerca.Finestra nativa: rilasciare la maniglia in chiusura
Funziona molto bene, e con la sottoclasse della finestra di Outlook con una finestra nativa, ottengo la stringa di ricerca, e già la passa nel mio pannello.
Il problema è ora, che quando si chiude il componente aggiuntivo (tramite "File-> Opzioni-> Add-Ins-> Componenti aggiuntivi COM", ma non con la X nel riquadro) , il componente aggiuntivo viene terminato all'istante e non è possibile chiamare in anticipo searchboxWindow.ReleaseHandle()
per ripristinare la catena WndProc. Outlook si blocca semplicemente senza errori visibili.
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch ((uint)m.Msg)
{
case WindowMessages.WM_DESTROY:
case WindowMessages.WM_QUIT:
case WindowMessages.WM_NCDESTROY:
this.ReleaseHandle();
return;
case WindowMessages.WM_KEYUP:
case WindowMessages.WM_LBUTTONDOWN:
case WindowMessages.WM_RBUTTONDOWN:
OnKeyUp();
break;
case WindowMessages.WM_EXITSIZEMOVE:
OnResize();
break;
}
}
Ho già provato ad ascoltare un paio di messaggi di finestra che dovrebbe essere chiamato quando il componente aggiuntivo viene chiuso, ma questi messaggi appaiono solo quando chiudo Outlook in modo normale.
Inoltre, gli eventi nel file di origine del componente aggiuntivo principale come AppDomain.CurrentDomain.ProcessExit
, this.Shutdown
o ((Outlook.ApplicationEvents_10_Event)this.Application).Quit
non vengono richiamati.
Quale evento è possibile ascoltare in modo che (attendibilmente) venga generato quando il componente aggiuntivo viene terminato? Ce ne sono alcuni? In caso contrario, quali sono le alternative per risolvere il mio problema?
Hai provato Dipose() e hai collegato un metodo all'evento Diposed per assicurarti che venisse effettivamente eliminato? –
Ho implementato l'interfaccia IDisposable e ho chiamato ReleaseHandle() lì, ma non ha avuto effetto? È questo che vuoi dire? –
Usa l'evento di spegnimento del componente aggiuntivo per annullare la sottoclasse della finestra. Il gestore di eventi ThisAddIn_Shutdown() generato automaticamente ha un linguaggio spaventoso ma viene comunque generato in questo scenario specifico. –