private static void BrindTopWndAssistAndDesk(TopWnd wnd) { var vwset = AssistBag.Where(k => k.IsVisible).ToList(); if (vwset.Count > 1) { var topWnd = GetTopMostAssistWindowHwnd(vwset); bool hasOtherTopDesk; if (topWnd.TopDesk == wnd.TopDesk) { hasOtherTopDesk = (((topWnd.TopAssistWnd != null) ? topWnd.TopAssistWnd.Desk : null) != topWnd.TopDesk || topWnd.HasOtherWndAssitUptoTopDesk); } else { hasOtherTopDesk = false; } if (hasOtherTopDesk) { var topWndAssist = vwset.FirstOrDefault(k => k.Desk == topWnd.TopDesk); if (topWndAssist != null && topWndAssist.Desk.IsMostlyVisible(true)) { topWndAssist.BringTop(); topWndAssist.Desk.BringTop(); } } } }
private static void BringWndAssitOfTopDeskTopMostIfNeed() { try { if ((DateTime.Now - _preKeepMultiWndAssitZOrderRightIfNeedTime).TotalMilliseconds >= 100.0) { _preKeepMultiWndAssitZOrderRightIfNeedTime = DateTime.Now; TopWnd topWnd = null; var vwset = new List <WndAssist>(); while (true) { vwset = AssistBag.Where(k => k.IsVisible).ToList(); if (vwset.Count <= 1) { if (vwset.Count == 1) { var wnd = vwset.First(); if (wnd.Desk.GetVisiblePercent(true) == 0.0) { wnd.Hide(); } } break; } topWnd = GetTopMostAssistWindowHwnd(vwset); if (topWnd == null || topWnd.TopAssistWnd == null || topWnd.TopDesk == null) { break; } if (topWnd.TopDesk.GetVisiblePercent(true) != 0.0) { if (((topWnd.TopAssistWnd != null) ? topWnd.TopAssistWnd.Desk : null) != topWnd.TopDesk || topWnd.HasOtherWndAssitUptoTopDesk) { DelayCaller.CallAfterDelayInUIThread(() => { BrindTopWndAssistAndDesk(topWnd); }, 500); } break; } topWnd.TopAssistWnd.Hide(); } } } catch (Exception ex) { Log.Exception(ex); } }
private static TopWnd GetTopMostAssistWindowHwnd(List <WndAssist> wnds) { var wndHwnds = wnds.Select(k => k.Handle); var deskHwnds = wnds.Select(k => k.Desk.Hwnd.Handle); var wndZorderDict = new Dictionary <int, int>(); var topDeskHwnd = 0; var topWndHwnd = 0; var deskZorder = 0; var wndZorder = 0; var zorder = int.MaxValue; WinApi.TraverDesktopHwnd((hwnd) => { int fzorder = zorder; zorder = fzorder - 1; if (wndHwnds.Contains(hwnd)) { if (topWndHwnd == 0) { topWndHwnd = hwnd; wndZorder = zorder; } wndZorderDict[hwnd] = zorder; } else if (deskHwnds.Contains(hwnd) && topDeskHwnd == 0) { topDeskHwnd = hwnd; deskZorder = zorder; } return(topWndHwnd == 0 || topDeskHwnd == 0); }, null, null); var wndAssist = wnds.FirstOrDefault(k => k.Desk.Hwnd.Handle == topDeskHwnd); var topDesk = wndAssist != null ? wndAssist.Desk : null; bool hasOtherWndAssitUptoTopDesk = false; if (topDesk != null) { var wndAssistOfTop = wnds.FirstOrDefault(k => k.Desk == topDesk); var assistWndHandleOfTopdesk = ((wndAssistOfTop != null) ? new int?(wndAssistOfTop.Handle) : null); if (assistWndHandleOfTopdesk != null) { hasOtherWndAssitUptoTopDesk = wndZorderDict.Where(kv => { bool rt; if (kv.Value > topDeskHwnd) { rt = !(kv.Key == assistWndHandleOfTopdesk.GetValueOrDefault() & assistWndHandleOfTopdesk != null); } else { rt = false; } return(rt); }).Any(); } } var topWnd = new TopWnd(); var topWndAssist = wnds.FirstOrDefault(k => k.Desk.Hwnd.Handle == topDeskHwnd); topWnd.TopDesk = ((topWndAssist != null) ? topWndAssist.Desk : null); topWnd.TopAssistWnd = wnds.FirstOrDefault(k => k.Handle == topWndHwnd); topWnd.DeskZorder = deskZorder; topWnd.WndZorder = wndZorder; topWnd.HasOtherWndAssitUptoTopDesk = hasOtherWndAssitUptoTopDesk; return(topWnd); }