public static void Save(System.Windows.Window wnd, Action <Dictionary <string, WindowStateData>, string> callback = null)
        {
            var wndPos   = GetWindowPositionData();
            var typeName = wnd.GetType().ToString();
            var data     = new List <WindowStateData>();

            if (wndPos == null)
            {
                wndPos           = new Dictionary <string, WindowStateData>();
                wndPos[typeName] = new WindowStateData();
            }
            else
            {
                if (!wndPos.ContainsKey(typeName))
                {
                    wndPos[typeName] = new WindowStateData();
                }
            }
            using (StreamWriter sw = File.CreateText(AppStateFilePath))
            {
                wndPos[typeName].WndName  = typeName;
                wndPos[typeName].Top      = wnd.Top;
                wndPos[typeName].Left     = wnd.Left;
                wndPos[typeName].Width    = wnd.Width;
                wndPos[typeName].Height   = wnd.Height;
                wndPos[typeName].WndState = wnd.WindowState;

                if (callback != null)
                {
                    callback(wndPos, typeName);
                }

                var json = JsonConvert.SerializeObject(wndPos.Select(d => d.Value).ToArray());
                sw.WriteLine(json);
            }
        }
 public static WindowStateData getAppropriateViewData()
 {
     var window = currentWindow();
     //
     var stateData = new WindowStateData();
     var placementData = new WINDOWPLACEMENT();
     GetWindowPlacement(window, out placementData);
     stateData.isVisible = (isWindowFocused(window) || (ThisAddIn.instance != null && ThisAddIn.instance.SSSW != null && ThisAddIn.instance.SSSW.HWND != null && isWindowFocused(ThisAddIn.instance.SSSW.HWND)));
     RECT rect = new RECT();
     if (placementData.showCmd != SW_SHOWMAXIMIZED)
     {
         GetWindowRect((int)window, ref rect);
         stateData.X = rect.left;
         stateData.Y = rect.top;
         stateData.Height = rect.bottom - rect.top;
     }
     else
     {
         stateData.X = 0;
         stateData.Y = 0;
         stateData.Height = System.Windows.Forms.Screen.FromHandle(window).WorkingArea.Height;
     }
     return stateData;
 }