@@ -101,15 +101,25 @@ public WinEventHook(WinEvent eventMin, WinEvent eventMax, SynchronizationContext
101101 // Is SetLastError used? - SetWinEventHook documentation does not indicate so
102102 throw new Win32Exception ( "SetWinEventHook failed" ) ;
103103 }
104- Logger . WinEvents . Info ( $ "SetWinEventHook success") ;
104+ Logger . WinEvents . Info ( $ "SetWinEventHook success on thread { Thread . CurrentThread . ManagedThreadId } ") ;
105105 }
106106
107107 // This runs on the Excel main thread - get off quickly
108108 void HandleWinEvent ( IntPtr hWinEventHook , WinEvent eventType , IntPtr hWnd ,
109- int idObject , int idChild , uint dwEventThread , uint dwmsEventTime )
109+ int idObject , int idChild , uint dwEventThread , uint dwmsEventTime )
110110 {
111- // CONSIDER: We might add some filtering here... maybe only interested in some of the window / event combinations
112- _syncContextAuto . Post ( OnWinEventReceived , new WinEventArgs ( eventType , hWnd , idObject , idChild , dwEventThread , dwmsEventTime ) ) ;
111+ try
112+ {
113+ if ( disposedValue )
114+ return ;
115+
116+ // CONSIDER: We might add some filtering here... maybe only interested in some of the window / event combinations
117+ _syncContextAuto . Post ( OnWinEventReceived , new WinEventArgs ( eventType , hWnd , idObject , idChild , dwEventThread , dwmsEventTime ) ) ;
118+ }
119+ catch ( Exception ex )
120+ {
121+ Logger . WinEvents . Warn ( $ "HandleWinEvent Exception { ex } ") ;
122+ }
113123 }
114124
115125 // Runs on our Automation thread (via SyncContext passed into the constructor)
@@ -128,13 +138,24 @@ protected virtual void Dispose(bool disposing)
128138 {
129139 if ( ! disposedValue )
130140 {
141+ Logger . WinEvents . Info ( $ "WinEventHook Dispose on thread { Thread . CurrentThread . ManagedThreadId } ") ;
131142 if ( disposing )
132143 {
133144 // TODO: dispose managed state (managed objects).
134145 }
135-
136- Logger . WinEvents . Info ( $ "UnhookWinEvent") ;
137- UnhookWinEvent ( _hWinEventHook ) ;
146+ _syncContextAuto . Post ( winEventHook =>
147+ {
148+ try
149+ {
150+ Logger . WinEvents . Info ( $ "UnhookWinEvent called on thread { Thread . CurrentThread . ManagedThreadId } ") ;
151+ bool result = UnhookWinEvent ( ( IntPtr ) winEventHook ) ;
152+ Logger . WinEvents . Info ( $ "UnhookWinEvent result { result } ") ;
153+ }
154+ catch ( Exception ex )
155+ {
156+ Logger . WinEvents . Warn ( $ "UnhookWinEvent Exception { ex } ") ;
157+ }
158+ } , _hWinEventHook ) ;
138159
139160 disposedValue = true ;
140161 }
0 commit comments