@@ -258,7 +258,19 @@ private static unsafe void InvokeShowQuickSwitchWindow(bool dialogWindowChanged)
258258 QuickSwitchWindowPosition = _settings . QuickSwitchWindowPosition ;
259259 }
260260
261- ShowQuickSwitchWindow ? . Invoke ( _dialogWindow . Handle ) ;
261+ IQuickSwitchDialogWindow dialogWindow = null ;
262+ lock ( _dialogWindowLock )
263+ {
264+ if ( _dialogWindow != null )
265+ {
266+ dialogWindow = _dialogWindow ;
267+ }
268+ }
269+ if ( dialogWindow != null )
270+ {
271+ ShowQuickSwitchWindow ? . Invoke ( dialogWindow . Handle ) ;
272+ }
273+
262274 if ( QuickSwitchWindowPosition == QuickSwitchWindowPositions . UnderDialog )
263275 {
264276 _dragMoveTimer ? . Start ( ) ;
@@ -267,6 +279,17 @@ private static unsafe void InvokeShowQuickSwitchWindow(bool dialogWindowChanged)
267279 // So we start & stop the timer when we find a file dialog window
268280 /*if (dialogWindowChanged)
269281 {
282+ HWND dialogWindowHandle = HWND.Null;
283+ lock (_dialogWindowLock)
284+ {
285+ if (_dialogWindow != null)
286+ {
287+ dialogWindowHandle = _dialogWindow.Handle;
288+ }
289+ }
290+
291+ if (dialogWindowHandle == HWND.Null) return;
292+
270293 if (!_moveSizeHook.IsNull)
271294 {
272295 PInvoke.UnhookWinEvent(_moveSizeHook);
@@ -275,7 +298,7 @@ private static unsafe void InvokeShowQuickSwitchWindow(bool dialogWindowChanged)
275298
276299 // Call _moveProc when the window is moved or resized
277300 uint processId;
278- var threadId = PInvoke.GetWindowThreadProcessId(_dialogWindow.Handle , &processId);
301+ var threadId = PInvoke.GetWindowThreadProcessId(dialogWindowHandle , &processId);
279302 _moveSizeHook = PInvoke.SetWinEventHook(
280303 PInvoke.EVENT_SYSTEM_MOVESIZESTART,
281304 PInvoke.EVENT_SYSTEM_MOVESIZEEND,
@@ -297,6 +320,11 @@ private static void InvokeUpdateQuickSwitchWindow()
297320
298321 private static void InvokeResetQuickSwitchWindow ( )
299322 {
323+ lock ( _dialogWindowLock )
324+ {
325+ _dialogWindow = null ;
326+ }
327+
300328 // Reset quick switch window
301329 ResetQuickSwitchWindow ? . Invoke ( ) ;
302330 _dragMoveTimer ? . Stop ( ) ;
@@ -308,11 +336,6 @@ private static void InvokeResetQuickSwitchWindow()
308336 PInvoke.UnhookWinEvent(_moveSizeHook);
309337 _moveSizeHook = HWINEVENTHOOK.Null;
310338 }*/
311-
312- lock ( _dialogWindowLock )
313- {
314- _dialogWindow = null ;
315- }
316339 }
317340
318341 private static void InvokeHideQuickSwitchWindow ( )
@@ -402,7 +425,15 @@ uint dwmsEventTime
402425 }
403426 else
404427 {
405- if ( _dialogWindow != null )
428+ var dialogWindowExist = false ;
429+ lock ( _dialogWindowLock )
430+ {
431+ if ( _dialogWindow != null )
432+ {
433+ dialogWindowExist = true ;
434+ }
435+ }
436+ if ( dialogWindowExist )
406437 {
407438 InvokeHideQuickSwitchWindow ( ) ;
408439 }
@@ -441,7 +472,15 @@ uint dwmsEventTime
441472 )
442473 {
443474 // If the dialog window is moved, update the quick switch window position
444- if ( _dialogWindow != null && _dialogWindow . Handle == hwnd )
475+ var dialogWindowExist = false ;
476+ lock ( _dialogWindowLock )
477+ {
478+ if ( _dialogWindow != null && _dialogWindow . Handle == hwnd )
479+ {
480+ dialogWindowExist = true ;
481+ }
482+ }
483+ if ( dialogWindowExist )
445484 {
446485 InvokeUpdateQuickSwitchWindow ( ) ;
447486 }
@@ -486,13 +525,18 @@ uint dwmsEventTime
486525 )
487526 {
488527 // If the dialog window is destroyed, set _dialogWindowHandle to null
489- if ( _dialogWindow != null && _dialogWindow . Handle == hwnd )
528+ var dialogWindowExist = false ;
529+ lock ( _dialogWindowLock )
490530 {
491- Log . Debug ( ClassName , $ "Destory dialog: { hwnd } ") ;
492- lock ( _dialogWindowLock )
531+ if ( _dialogWindow != null && _dialogWindow . Handle == hwnd )
493532 {
533+ Log . Debug ( ClassName , $ "Destory dialog: { hwnd } ") ;
494534 _dialogWindow = null ;
535+ dialogWindowExist = true ;
495536 }
537+ }
538+ if ( dialogWindowExist )
539+ {
496540 lock ( _autoSwitchedDialogsLock )
497541 {
498542 _autoSwitchedDialogs . Remove ( hwnd ) ;
0 commit comments