/** * <summary> * ウィンドウ移動イベントが発生したら * 該当モニターがモニター移動したかどうかを判断し * 移動していたら以下を行う * * 移動前モニターの整列しなおし、移動前WindowManagerからの削除 * * 移動後モニターの整列しなおし、移動後WindowManagerへの追加 * </summary> */ private void TraceWindow_LocationChangeEvent(object sender, TraceWindow.OriginalWinEventArg w) { try { Logger.DebugWindowInfo("Window LocationChange", w.WindowInfo); if (w.WindowInfo.MovedMonitor()) { Logger.DebugWindowInfo("Window MonitorChange", w.WindowInfo); var beforeMovedMonitorHandle = w.WindowInfo.GetMonitorHandle(); var beforeMovedWindowManager = this.monitorManager.FindWindowManagerByMonitorHandle(beforeMovedMonitorHandle); Logger.DebugWindowInfo("Remove From BeforeMovedWindowManager", w.WindowInfo); beforeMovedWindowManager.Remove(w.WindowInfo); this.ArrangeWindows(); w.WindowInfo.ComputeMonitorHandle(); Logger.DebugWindowInfo("Add To NewWindowManager", w.WindowInfo); var windowManager = this.monitorManager.PushNewWindowInfo(w.WindowInfo); this.monitorManager.SetCurrentWindowManagerIndexByMonitorHandle(w.WindowInfo.monitorHandle); this.ArrangeWindows(); // TODO フォーカスが移動先のモニターに移動してしまうが、元のモニターのほうがよいような気もする this.HighlightActiveMonitor(); } } catch (Exception ex) { Logger.Exception(ex); throw ex; } }
/** * <summary> * ウィンドウHideイベントが発生したら * 該当モニターのWindowManagerから削除し、現在のモードで整列しなおす * </summary> */ private void TraceWindow_HideEvent(object sender, TraceWindow.OriginalWinEventArg w) { try { Logger.DebugWindowInfo("Window Hide", w.WindowInfo); var windowManager = this.monitorManager.RemoveWindowInfo(w.WindowInfo); this.ArrangeWindows(); this.monitorManager.ActivateWindow(); } catch (Exception ex) { Logger.Exception(ex); throw ex; } }
/** * <summary> * ウィンドウアクティヴ化イベントが発生したら * カレントモニターのカレントウィンドウと等しいか確認し * 異なればそのウィンドウをカレントウィンドウ、カレントモニターにする * </summary> */ private void TraceWindow_ActivateEvent(object sender, TraceWindow.OriginalWinEventArg w) { try { Logger.DebugWindowInfo("Window Activated", w.WindowInfo); var currentWindowInfo = this.monitorManager.GetCurrentMonitorWindowManager().GetCurrentWindow(); var activatedWindowInfo = w.WindowInfo; if ((currentWindowInfo == null) || currentWindowInfo.Equals(activatedWindowInfo)) { return; } // アクティヴ化されたウィンドウをカレントにして、そのウィンドウの所属モニターをカレントにする this.monitorManager.ActivateWindowInfo(activatedWindowInfo); } catch (Exception ex) { Logger.Exception(ex); throw ex; } }