@@ -56,9 +56,6 @@ public static class QuickSwitch
5656 private static IQuickSwitchDialogWindow _dialogWindow = null ;
5757 private static readonly object _dialogWindowLock = new ( ) ;
5858
59- private static IQuickSwitchDialogWindow _currentDialogWindow = null ;
60- private static readonly object _currentDialogWindowLock = new ( ) ;
61-
6259 private static HWINEVENTHOOK _foregroundChangeHook = HWINEVENTHOOK . Null ;
6360 private static HWINEVENTHOOK _locationChangeHook = HWINEVENTHOOK . Null ;
6461 private static HWINEVENTHOOK _destroyChangeHook = HWINEVENTHOOK . Null ;
@@ -197,15 +194,6 @@ public static void SetupQuickSwitch(bool enabled)
197194 dialogWindowExists = true ;
198195 }
199196 }
200- lock ( _currentDialogWindowLock )
201- {
202- if ( _currentDialogWindow != null )
203- {
204- _currentDialogWindow . Dispose ( ) ;
205- _currentDialogWindow = null ;
206- dialogWindowExists = true ;
207- }
208- }
209197
210198 // Remove auto switched dialogs
211199 lock ( _autoSwitchedDialogsLock )
@@ -249,26 +237,15 @@ public static void SetupQuickSwitch(bool enabled)
249237
250238 #region Invoke Property Events
251239
252- private static unsafe void InvokeShowQuickSwitchWindow ( )
240+ private static unsafe void InvokeShowQuickSwitchWindow ( bool dialogWindowChanged )
253241 {
254242 // Show quick switch window
255243 if ( _settings . ShowQuickSwitchWindow )
256244 {
257- lock ( _currentDialogWindowLock )
245+ if ( dialogWindowChanged )
258246 {
259- lock ( _dialogWindowLock )
260- {
261- var currentDialogWindowChanged = _currentDialogWindow == null ||
262- _currentDialogWindow != _dialogWindow ;
263-
264- if ( currentDialogWindowChanged )
265- {
266- // Save quick switch window position for one file dialog
267- QuickSwitchWindowPosition = _settings . QuickSwitchWindowPosition ;
268- }
269-
270- _currentDialogWindow = _dialogWindow ;
271- }
247+ // Save quick switch window position for one file dialog
248+ QuickSwitchWindowPosition = _settings . QuickSwitchWindowPosition ;
272249 }
273250
274251 ShowQuickSwitchWindow ? . Invoke ( _dialogWindow . Handle ) ;
@@ -278,34 +255,25 @@ private static unsafe void InvokeShowQuickSwitchWindow()
278255 // Note: Here we do not start & stop the timer beacause when there are many dialog windows
279256 // Unhooking and hooking will take too much time which can make window position weird
280257 // So we start & stop the timer when we find a file dialog window
281- /*lock (_currentDialogWindowLock )
258+ /*if (dialogWindowChanged )
282259 {
283- lock (_dialogWindowLock )
260+ if (!_moveSizeHook.IsNull )
284261 {
285- var currentDialogWindowChanged = _currentDialogWindow == null ||
286- _currentDialogWindow != _dialogWindow;
287-
288- if (currentDialogWindowChanged)
289- {
290- if (!_moveSizeHook.IsNull)
291- {
292- PInvoke.UnhookWinEvent(_moveSizeHook);
293- _moveSizeHook = HWINEVENTHOOK.Null;
294- }
295-
296- // Call MoveSizeCallBack when the window is moved or resized
297- uint processId;
298- var threadId = PInvoke.GetWindowThreadProcessId(_dialogWindow.Handle, &processId);
299- _moveSizeHook = PInvoke.SetWinEventHook(
300- PInvoke.EVENT_SYSTEM_MOVESIZESTART,
301- PInvoke.EVENT_SYSTEM_MOVESIZEEND,
302- PInvoke.GetModuleHandle((PCWSTR)null),
303- MoveSizeCallBack,
304- processId,
305- threadId,
306- PInvoke.WINEVENT_OUTOFCONTEXT);
307- }
262+ PInvoke.UnhookWinEvent(_moveSizeHook);
263+ _moveSizeHook = HWINEVENTHOOK.Null;
308264 }
265+
266+ // Call MoveSizeCallBack when the window is moved or resized
267+ uint processId;
268+ var threadId = PInvoke.GetWindowThreadProcessId(_dialogWindow.Handle, &processId);
269+ _moveSizeHook = PInvoke.SetWinEventHook(
270+ PInvoke.EVENT_SYSTEM_MOVESIZESTART,
271+ PInvoke.EVENT_SYSTEM_MOVESIZEEND,
272+ PInvoke.GetModuleHandle((PCWSTR)null),
273+ MoveSizeCallBack,
274+ processId,
275+ threadId,
276+ PInvoke.WINEVENT_OUTOFCONTEXT);
309277 }*/
310278 }
311279 }
@@ -335,10 +303,6 @@ private static void InvokeResetQuickSwitchWindow()
335303 {
336304 _dialogWindow = null ;
337305 }
338- lock ( _currentDialogWindowLock )
339- {
340- _currentDialogWindow = null ;
341- }
342306 }
343307
344308 private static void InvokeHideQuickSwitchWindow ( )
@@ -374,12 +338,14 @@ uint dwmsEventTime
374338 {
375339 // File dialog window
376340 var findDialogWindow = false ;
341+ var dialogWindowChanged = false ;
377342 foreach ( var dialog in _quickSwitchDialogs )
378343 {
379344 if ( dialog . CheckDialogWindow ( hwnd ) )
380345 {
381346 lock ( _dialogWindowLock )
382347 {
348+ dialogWindowChanged = _dialogWindow == null || _dialogWindow . Handle != hwnd ;
383349 _dialogWindow = dialog . DialogWindow ;
384350 }
385351
@@ -403,17 +369,17 @@ uint dwmsEventTime
403369 // Just show quick switch window
404370 if ( alreadySwitched )
405371 {
406- InvokeShowQuickSwitchWindow ( ) ;
372+ InvokeShowQuickSwitchWindow ( dialogWindowChanged ) ;
407373 }
408374 // Show quick switch window after navigating the path
409375 else
410376 {
411- NavigateDialogPath ( hwnd , InvokeShowQuickSwitchWindow ) ;
377+ NavigateDialogPath ( hwnd , ( ) => InvokeShowQuickSwitchWindow ( dialogWindowChanged ) ) ;
412378 }
413379 }
414380 else
415381 {
416- InvokeShowQuickSwitchWindow ( ) ;
382+ InvokeShowQuickSwitchWindow ( dialogWindowChanged ) ;
417383 }
418384 }
419385 // Quick switch window
@@ -668,7 +634,7 @@ private static void NavigateDialogPath(HWND hwnd, Action action = null)
668634
669635 // Get explorer path
670636 string path ;
671- lock ( _dialogWindowLock )
637+ lock ( _lastExplorerLock )
672638 {
673639 path = _lastExplorer ? . GetExplorerPath ( ) ;
674640 }
@@ -843,10 +809,6 @@ public static void Dispose()
843809 {
844810 _dialogWindow = null ;
845811 }
846- lock ( _currentDialogWindowLock )
847- {
848- _currentDialogWindow = null ;
849- }
850812
851813 // Stop drag move timer
852814 if ( _dragMoveTimer != null )
0 commit comments