2015-08-11 12 views
7

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?

+0

Hai provato Dipose() e hai collegato un metodo all'evento Diposed per assicurarti che venisse effettivamente eliminato? –

+0

Ho implementato l'interfaccia IDisposable e ho chiamato ReleaseHandle() lì, ma non ha avuto effetto? È questo che vuoi dire? –

+3

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. –

risposta

1

RISOLTO: Grazie alla Hans Passant

Sembra davvero che il ThisAddIn_Shutdown evento viene attivato quando il componente aggiuntivo è disconnettere manualmente tramite la finestra di dialogo Componenti aggiuntivi COM.

0

Non credo ci sia molto che si possa fare nel codice gestito. Il codice non modificato avrebbe funzionato correttamente; il sistema COM ti chiederà gentilmente se la tua DLL può essere scaricata chiamando la tua implementazione di DllCanUnload.

+0

Quindi basicamente non posso fare nulla finché non riscrivo il mio progetto in C++ o simili? –

+0

Non riesco a pensare a un modo per farlo nel codice gestito. –

Problemi correlati