/// <summary> /// Closes the form by click the 'x' in the top right hand corner of the form /// </summary> public void Close() { if (NM.IsWindow(Identity.Handle)) { if (NM.IsWindowVisible(Identity.Handle)) { if (NM.IsIconic(Identity.Handle)) { throw new Exception("Can not close the window as it is minimised"); } GUI.m_APE.AddFirstMessageGetTitleBarItemRectangle(Identity.Handle, NM.TitleBarStateElement.Close); GUI.m_APE.SendMessages(EventSet.APE); GUI.m_APE.WaitForMessages(EventSet.APE); //Get the value(s) returned MUST be done straight after the WaitForMessages call NM.StateSystem State = (NM.StateSystem)GUI.m_APE.GetValueFromMessage(); int Top = GUI.m_APE.GetValueFromMessage(); int Left = GUI.m_APE.GetValueFromMessage(); int Bottom = GUI.m_APE.GetValueFromMessage(); int Right = GUI.m_APE.GetValueFromMessage(); // Check the close button is actually displayed if (State != NM.StateSystem.STATE_SYSTEM_NORMAL && State != NM.StateSystem.STATE_SYSTEM_PRESSED) { throw new Exception("Can not close the window as the close button is in state '" + State.ToString() + "'"); } NM.tagRect WindowRect; NM.GetWindowRect(Identity.Handle, out WindowRect); int X = Left + ((Right - Left) / 2) - WindowRect.left; int Y = Top + ((Bottom - Top) / 2) - WindowRect.top; Input.Block(Identity.ParentHandle, Identity.Handle); try { GUI.Log("Close the " + Identity.Description, LogItemType.Action); base.SingleClickInternal(X, Y, MouseButton.Left, MouseKeyModifier.None); //Wait for the window to disappear base.WaitForControlToNotBeVisible(); } finally { Input.Unblock(); } } } }
/// <summary> /// Restores the window back clicking the restore button in the top right corner of the form /// Note if the window is minimised then a non-gui method is used to restore the form /// </summary> public void Restore() { GUI.Log("Restore the " + Identity.Description, LogItemType.Action); string windowState = FormWindowState(); if (windowState == "Normal") { throw new Exception("Can not restore the window as it already is"); } if (windowState == "Minimized") { Input.Block(Identity.ParentHandle, Identity.Handle); try { NM.ShowWindow(Identity.Handle, NM.SW_RESTORE); //Bring it to the front (can sometimes get restored to the background using the api) SetFocus(); // Wait for the animation to finish base.WaitForAnimation(Identity.Handle, true, AnimationUtils.WaitForAnimationSource.Form); // Check the window is now normal Stopwatch timer = Stopwatch.StartNew(); do { GUI.m_APE.AddFirstMessageFindByHandle(DataStores.Store0, Identity.ParentHandle, Identity.Handle); GUI.m_APE.AddQueryMessageReflect(DataStores.Store0, DataStores.Store1, "WindowState", MemberTypes.Property); GUI.m_APE.AddQueryMessageReflect(DataStores.Store1, DataStores.Store2, "ToString", MemberTypes.Method); GUI.m_APE.AddRetrieveMessageGetValue(DataStores.Store2); GUI.m_APE.SendMessages(EventSet.APE); GUI.m_APE.WaitForMessages(EventSet.APE); //Get the value(s) returned MUST be done straight after the WaitForMessages call windowState = GUI.m_APE.GetValueFromMessage(); if (timer.ElapsedMilliseconds > GUI.m_APE.TimeOut) { timer.Stop(); throw new Exception("Failed to restore the window"); } Thread.Sleep(15); }while (windowState != "Normal"); timer.Stop(); } finally { Input.Unblock(); } } else { GUI.m_APE.AddFirstMessageGetTitleBarItemRectangle(Identity.Handle, NM.TitleBarStateElement.Maximize); GUI.m_APE.SendMessages(EventSet.APE); GUI.m_APE.WaitForMessages(EventSet.APE); //Get the value(s) returned MUST be done straight after the WaitForMessages call NM.StateSystem State = (NM.StateSystem)GUI.m_APE.GetValueFromMessage(); int Top = GUI.m_APE.GetValueFromMessage(); int Left = GUI.m_APE.GetValueFromMessage(); int Bottom = GUI.m_APE.GetValueFromMessage(); int Right = GUI.m_APE.GetValueFromMessage(); // Check the maximise button is actually displayed if (State != NM.StateSystem.STATE_SYSTEM_NORMAL && State != NM.StateSystem.STATE_SYSTEM_PRESSED) { throw new Exception("Can not restore the window as the restore button is in state '" + State.ToString() + "'"); } NM.tagRect WindowRect; NM.GetWindowRect(Identity.Handle, out WindowRect); int X = Left + ((Right - Left) / 2) - WindowRect.left; int Y = Top + ((Bottom - Top) / 2) - WindowRect.top; Input.Block(Identity.ParentHandle, Identity.Handle); try { base.SingleClickInternal(X, Y, MouseButton.Left, MouseKeyModifier.None); // Wait for the animation to finish base.WaitForAnimation(Identity.Handle, true, AnimationUtils.WaitForAnimationSource.Form); // Check the window is now minimised Stopwatch timer = Stopwatch.StartNew(); do { GUI.m_APE.AddFirstMessageFindByHandle(DataStores.Store0, Identity.ParentHandle, Identity.Handle); GUI.m_APE.AddQueryMessageReflect(DataStores.Store0, DataStores.Store1, "WindowState", MemberTypes.Property); GUI.m_APE.AddQueryMessageReflect(DataStores.Store1, DataStores.Store2, "ToString", MemberTypes.Method); GUI.m_APE.AddRetrieveMessageGetValue(DataStores.Store2); GUI.m_APE.SendMessages(EventSet.APE); GUI.m_APE.WaitForMessages(EventSet.APE); //Get the value(s) returned MUST be done straight after the WaitForMessages call windowState = GUI.m_APE.GetValueFromMessage(); if (timer.ElapsedMilliseconds > GUI.m_APE.TimeOut) { timer.Stop(); throw new Exception("Failed to restore the window"); } Thread.Sleep(15); }while (windowState != "Normal"); timer.Stop(); } finally { Input.Unblock(); } } }
/// <summary> /// Minimises the form by clicking the minimise button in the top right hand corner of the form /// </summary> public void Minimise() { GUI.Log("Minimise the " + Identity.Description, LogItemType.Action); string windowState = FormWindowState(); if (windowState == "Minimized") { throw GUI.ApeException("Can not minimise the window as it already is"); } GUI.m_APE.AddFirstMessageGetTitleBarItemRectangle(Identity.Handle, NM.TitleBarStateElement.Minimize); GUI.m_APE.SendMessages(EventSet.APE); GUI.m_APE.WaitForMessages(EventSet.APE); //Get the value(s) returned MUST be done straight after the WaitForMessages call NM.StateSystem State = (NM.StateSystem)GUI.m_APE.GetValueFromMessage(); int Top = GUI.m_APE.GetValueFromMessage(); int Left = GUI.m_APE.GetValueFromMessage(); int Bottom = GUI.m_APE.GetValueFromMessage(); int Right = GUI.m_APE.GetValueFromMessage(); // Check the maximise button is actually displayed if (State != NM.StateSystem.STATE_SYSTEM_NORMAL && State != NM.StateSystem.STATE_SYSTEM_PRESSED) { throw GUI.ApeException("Can not minimise the window as the minimised button is in state '" + State.ToString() + "'"); } NM.tagRect WindowRect; NM.GetWindowRect(Identity.Handle, out WindowRect); int X = Left + ((Right - Left) / 2) - WindowRect.left; int Y = Top + ((Bottom - Top) / 2) - WindowRect.top; Input.Block(); try { base.SingleClickInternal(X, Y, MouseButton.Left, MouseKeyModifier.None, 32, 32); // Wait for the animation to finish base.WaitForAnimation(Identity.Handle, true, AnimationUtils.WaitForAnimationSource.Form); // Check the window is now minimised Stopwatch timer = Stopwatch.StartNew(); do { windowState = FormWindowState(); if (timer.ElapsedMilliseconds > GUI.m_APE.TimeOut) { timer.Stop(); throw GUI.ApeException("Failed to minimise the window"); } Thread.Sleep(15); }while (windowState != "Minimized"); timer.Stop(); } catch when(Input.ResetInputFilter()) { // Will never be reached as ResetInputFilter always returns false } finally { Input.Unblock(); } }