2010-12-10 5 views
7

Как принять форму, которая в настоящее время минимизирована, и восстановить ее в прежнее состояние. Я не могу найти способ определить, был ли его предыдущий WindowState равен Normal или Maximized; но я знаю, что информация должна храниться где-то, потому что в окнах нет проблем с приложениями на панели задач.C# Programmatically Unminimize form

ответ

8

Для этого не существует управляемого API. Способ сделать это - PInvoke GetWindowPlacement и проверить на WPF_RESTORETOMAXIMIZED.

Подробнее см. Здесь Microsoft How To (который демонстрирует технику в VB).

В C#, это было бы:

[DllImport("user32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); 


private struct WINDOWPLACEMENT 
{ 
    public int length; 
    public int flags; 
    public int showCmd; 
    public System.Drawing.Point ptMinPosition; 
    public System.Drawing.Point ptMaxPosition; 
    public System.Drawing.Rectangle rcNormalPosition; 
} 

public void RestoreFromMinimzied(Form form) 
{ 
    const int WPF_RESTORETOMAXIMIZED = 0x2; 
    WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); 
    placement.length = Marshal.SizeOf(placement); 
    GetWindowPlacement(form.Handle, ref placement); 

    if ((placement.flags & WPF_RESTORETOMAXIMIZED) == WPF_RESTORETOMAXIMIZED) 
     form.WindowState = FormWindowState.Maximized; 
    else 
     form.WindowState = FormWindowState.Normal; 
} 
+0

@ Dan: Спасибо - я исправил ошибки - (я набирал текст на лету и копировал с pinvoke.net, у которого была ошибка ref/out) –

+1

@ Dan: Звучит так, что это сработало для вас , как минимум ;) –

7
this.WindowState = FormWindowState.Normal; 

Вы также:

this.WindowState = FormWindowState.Minimized; 
this.WindowState = FormWindowState.Maximized; 

Ах, я неправильно понял вопрос:

Restore WindowState from Minimized должно быть то, что вы ищете. Он говорит, что вы можете имитировать поведение панели задач, как это:

SendMessage(form.Handle, WM_SYSCOMMAND, SC_RESTORE, 0); 
+2

Это не ответ на свой вопрос - он спрашивает, стоит ли идти к нормальному или Развернутому если форма в настоящее время сведена к минимуму ... –

+0

Я обновил свой ответ. Я не понял этот вопрос. –

+0

Это гораздо более чистое решение - очень просто реализовать. –

1

Если вы хотите сохранить предыдущее состояние, когда есть изменения (развернуть/свернуть), вам придется внедриться в SizeChanged случае, согласно this post on MSDN , Вы можете получить WindowState и сохранить его.

+1

Есть лучший вариант, чем хранить это самостоятельно. Это уже отслеживается Windows API. –

3

Вы можете отслеживать изменения состояния окна через событие Resize. Как это:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     prevState = currState = this.WindowState; 
    } 
    protected override void OnResize(EventArgs e) { 
     if (currState != this.WindowState) { 
      prevState = currState; 
      currState = this.WindowState; 
     } 
     base.OnResize(e); 
    } 
    private FormWindowState prevState, currState; 
} 
Смежные вопросы