2010-12-10 43 views
7

Làm cách nào để lấy một biểu mẫu hiện đang thu nhỏ và khôi phục lại trạng thái trước đó của nó. Tôi không thể tìm thấy bất kỳ cách nào để xác định xem WindowState trước đó của mình là Normal hoặc Maximized; nhưng tôi biết thông tin phải được lưu trữ ở đâu đó bởi vì các cửa sổ không có vấn đề gì với các ứng dụng trên thanh tác vụ.C# Rút gọn theo lập trình mẫu

Trả lời

8

Không có API được quản lý cho điều này. Cách để làm điều đó là để PInvoke GetWindowPlacement và kiểm tra WPF_RESTORETOMAXIMIZED.

Để biết chi tiết, hãy xem Microsoft How To (đây là minh họa kỹ thuật trong VB).

Trong C#, đây sẽ là:

[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: Cảm ơn - Tôi đã sửa các lỗi - (Tôi đang gõ khi đang di chuyển, và sao chép từ pinvoke.net, có vấn đề về ref/out sai ...) –

+1

@Dan: Âm thanh như thế này hiệu quả với bạn, mặc dù , ít nhất ;) –

7
this.WindowState = FormWindowState.Normal; 

Bạn cũng có:

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

Ah, tôi hiểu lầm câu hỏi:

Restore WindowState from Minimized nên được những gì bạn đang tìm kiếm. Nó nói rằng bạn có thể bắt chước các hành vi thanh tác vụ như thế này:

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

Điều đó không trả lời câu hỏi của anh ấy - anh ấy hỏi có nên chuyển sang Bình thường hoặc Tối đa nếu biểu mẫu hiện đang được thu nhỏ ... –

+0

Tôi đã cập nhật câu trả lời của mình. Tôi hiểu lầm câu hỏi. –

+0

Đây là một giải pháp sạch hơn - rất đơn giản để thực hiện. –

1

Nếu bạn muốn lưu trữ các trạng thái trước đó bất cứ khi nào có một sự thay đổi (tối đa/tối thiểu), bạn sẽ phải móc vào các sự kiện SizeChanged, theo this post on MSDN . Bạn có thể lấy số WindowState tại đó và lưu trữ.

+1

Có một lựa chọn tốt hơn so với lưu trữ này cho mình. Nó đã được theo dõi bởi Windows API. –

3

Bạn có thể theo dõi những thay đổi trạng thái cửa sổ thông qua các sự kiện Resize. Như thế này:

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; 
} 
Các vấn đề liên quan