2008-12-09 6 views
25

Есть ли простой способ восстановить свернутую форму в ее предыдущее состояние, как Normal, так и Maximized? Я ожидаю такую ​​же функциональность, как щелчок на панели задач (или щелчок правой кнопкой мыши и выбор восстановления).Восстановить WindowState из Minimized

До сих пор у меня это было, но если форма была предварительно увеличена, она все равно возвращается как обычное окно.

if (docView.WindowState == FormWindowState.Minimized) 
    docView.WindowState = FormWindowState.Normal; 

Должен ли я обрабатывать изменение состояния в форме, чтобы помнить предыдущее состояние?

ответ

31

Я использую следующий метод расширения:

using System.Runtime.InteropServices; 

namespace System.Windows.Forms 
{ 
    public static class Extensions 
    { 
     [DllImport("user32.dll")] 
     private static extern int ShowWindow(IntPtr hWnd, uint Msg); 

     private const uint SW_RESTORE = 0x09; 

     public static void Restore(this Form form) 
     { 
      if (form.WindowState == FormWindowState.Minimized) 
      { 
       ShowWindow(form.Handle, SW_RESTORE); 
      } 
     } 
    } 
} 

Затем вызовите form.Restore() в моем коде.

+0

Кто-нибудь еще видит несколько значков, отображаемых в системном трее, когда вы нажимаете стрелку^(ака больше значков)? Когда вы нависаете над лишними, они исчезают, поэтому кажется, что это проблема обновления. – MacGyver 2015-11-23 20:25:04

4

Вы можете имитировать нажатия на кнопку на панели задач, как это:

SendMessage(docView.Handle, WM_SYSCOMMAND, SC_RESTORE, 0); 
3

Для меня, приведенный выше код не работает.

Но, наконец, я нашел рабочий код. Вот он:

CxImports.ManagedWindowPlacement placement = new CxImports.ManagedWindowPlacement(); 
CxImports.GetWindowPlacement(Convert.ToUInt32(Handle.ToInt64()), placement); 

if (placement.flags == CxImports.WPF_RESTORETOMAXIMIZED) 
    WindowState = FormWindowState.Maximized; 
else 
    WindowState = FormWindowState.Normal; 

Я думаю, вы можете найти все необходимые «импортированные» функции простым поиском по Google.

11

Самый простой способ восстановить форму в нормальное состояние:

if (MyForm.WindowState == FormWindowState.Minimized) 
{ 
    MyForm.WindowState = FormWindowState.Normal; 
} 
+0

Что делать, если предыдущее состояние окна не было «Нормальным», а «Максимизировано»? – 2018-02-10 19:37:14

-1

Приведенный выше код не совсем работа для меня во всех ситуациях

После проверки флагов я также должны проверить showcmd = 3, и если так максимизировать другое восстановление

Смежные вопросы