2010-12-10 9 views
7

मैं एक ऐसा फॉर्म कैसे ले सकता हूं जो वर्तमान में कम हो गया है और इसे अपने पिछले राज्य में पुनर्स्थापित कर सकता है। मुझे यह निर्धारित करने का कोई तरीका नहीं मिल रहा है कि उसका पिछला WindowStateNormal या Maximized था; लेकिन मुझे पता है कि जानकारी कहीं भी संग्रहीत की जानी चाहिए क्योंकि विंडोज़ को टास्कबार पर ऐप्स के साथ ऐसा करने में कोई समस्या नहीं है।सी # प्रोग्रामेटिक रूप से फॉर्म को कम करें

उत्तर

8

इसके लिए कोई प्रबंधित API नहीं है। ऐसा करने का तरीका PInvoke GetWindowPlacement है और WPF_RESTORETOMAXIMIZED के लिए जांचें।

विवरण के लिए, यह Microsoft How To देखें (जो वीबी में तकनीक का प्रदर्शन कर रहा है)।

सी # में, यह होगा:

[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

@ डैन: धन्यवाद - मैंने त्रुटियों को ठीक किया - (मैं फ्लाई पर टाइप कर रहा था, और पिनवोक.net से कॉपी कर रहा था, जिसमें रेफ/आउट समस्या गलत थी ...) –

+1

@Dan: ऐसा लगता है जैसे यह आपके लिए काम करता है, हालांकि , कम से कम ;) –

7
this.WindowState = FormWindowState.Normal; 

तुम भी है:

Restore WindowState from Minimized आप जो खोज रहे हैं होना चाहिए:

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

आह, मैं सवाल गलत समझा। इसमें कहा गया है कि आप इस तरह टास्कबार व्यवहार की नकल कर सकते हैं:

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

कि उसके सवाल का जवाब नहीं है - वह है कि क्या सामान्य करने के लिए जा सकते हैं या अधिकतम करने के लिए करता है, तो फ़ॉर्म में इस समय कम से कम है पूछ रहा है ... –

+0

मैं अपने जवाब अपडेट किया गया। मैंने सवाल गलत समझा। –

+0

यह एक बहुत साफ समाधान है - कार्यान्वित करने के लिए बहुत आसान है। –

1

आप जब भी एक परिवर्तन (अधिकतम/कम से कम), तो आपको SizeChanged घटना में हुक करना होगा है पहले वाली स्थिति स्टोर करने के लिए चाहते हैं, this post on MSDN के अनुसार । आप वहां WindowState प्राप्त कर सकते हैं और इसे स्टोर कर सकते हैं।

+1

इसे स्वयं संग्रहित करने से बेहतर विकल्प है। यह पहले ही विंडोज एपीआई द्वारा ट्रैक किया गया है। –

3

आप आकार घटना के माध्यम से खिड़की राज्य परिवर्तनों को ट्रैक कर सकते हैं। इस तरह:

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; 
} 
संबंधित मुद्दे