2012-09-04 8 views
10

तो मैं तुरंत करना चाहता हूं, क्योंकि कार्यक्रम का यह हिस्सा गति पर निर्भर करता है, जब मेरे मुख्य रूप में विंडोस्टेट बदल जाता है तो एक फ़ंक्शन ट्रिगर करता है। मैं यह कुछ इस तरह होने की जरूरत:जब भी विंडोस्टेट सी # में बदलता है तो मैं कुछ कैसे ट्रिगर करूं?

private void goButton_Click(object sender, EventArgs e) 
{ 
    //Code 
} 

मैं फार्म की घटनाओं टैब के माध्यम से जाँच की है, मेरे पास कोई WindowStateChanged है, आदि मैं यह करने के लिए कैसे करते हैं?

फ़ॉर्म का आकार बदल दिया जाएगा, इसलिए आकार परिवर्तनों की जांच करने पर जांच नहीं होगी।

+0

फॉर्म का आकार क्यों बदल दिया जाएगा और विंडोस्टेट चेंज किए गए ईवेंट (यदि यह अस्तित्व में है) का जवाब देने के लिए 'if (windowState == x)' के प्रदर्शन के सापेक्ष क्या होगा? – Mufaka

उत्तर

18

Resize ईवेंट (या SizeChanged) विंडोस्टेट में परिवर्तन होने पर आग लग जाएगी।


एक तरफ ध्यान दें पर, WPF इस के लिए एक StateChanged घटना सीधे शामिल नहीं है।

+0

+1 वर्तमान API को दिए गए सबसे अच्छे उत्तर की तरह लगता है। – Mufaka

+0

बहुत बहुत धन्यवाद! क्या किसी को स्क्रीन के एक तरफ खिड़की चलने पर किसी घटना को आग लगाने का तरीका पता है? (स्क्रीन के किनारे कैप्शन और ड्रैग विंडो पर क्लिक करें) आकार बदल गया है निश्चित रूप से आग लग जाएगी, लेकिन क्या वह जानकारी पाने के लिए कोई फ़ील्ड या कुछ है? –

+0

@NoelWidmer आपको शायद Win7 + कार्यक्षमता के लिए विंडोज एपीआई कॉल का उपयोग करने की आवश्यकता होगी। यकीन नहीं है कि वे हाथ से क्या होगा, हालांकि। –

0

आप इसका उपयोग कर किसी अन्य धागे से एक फॉर्म की विंडो स्थिति का पीछा कर सकते हैं। यह .NET Framework 3.5

Invoke(new Action(() => { this.WindowState = FormWindowState.Normal; })); 

मुझे आशा है कि यह आपकी मदद कर सकता है।

public partial class Form1 : Form { 
private FormWindowState mLastState; 
public Form1() { 
    InitializeComponent(); 
    mLastState = this.WindowState; 
} 
protected override void OnClientSizeChanged(EventArgs e) { 
    if (this.WindowState != mLastState) { 
    mLastState = this.WindowState; 
    OnWindowStateChanged(e); 
    } 
    base.OnClientSizeChanged(e); 
} 
protected void OnWindowStateChanged(EventArgs e) { 
    // Do your stuff 
} 
} 
+0

यह विंडोस्टेट प्रॉपर्टी को सेट करने के लिए उपयोगी है, लेकिन मुझे लगता है कि सवाल यह था कि बदलाव के बाद निकाल दिए गए ईवेंट को कैसे पकड़ें। – funseiki

+0

मुझे खेद है @funseiki। मुझे आपका प्रश्न मिला। मुझे जल्द ही एक जवाब मिल जाएगा। –

1

आप के रूप this link पता चलता है WndProc समारोह अधिरोहण करने का प्रयास कर सकता है।

पद से:

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == /*WM_SIZE*/ 0x0005) 
    { 
     if(this.WindowState == FormWindowState.Minimized) 
     { 
      // do something here 
     } 
    } 

    base.WndProc(ref m); 
} 

इस कोड को बस की जाँच करता है जब भी कोई Resize घटना निकाल दिया जाता है किस रूप में राज्य है।

वैकल्पिक रूप से, आप शायद फॉर्म के Resize ईवेंट को पकड़ सकते हैं और वहां से विंडो स्थिति की जांच कर सकते हैं। लेकिन मैंने सुना है कि जब नियंत्रण (या फॉर्म?) अधिकतम होता है तो यह आग नहीं होता है।

आशा है कि इससे मदद मिलती है!

2

मुझे आशा है कि मैं पार्टी के लिए बहुत देर से नहीं हूं।

तरह से मैं यह बहुत सीधे आगे है और वैश्विक चर आवंटन की आवश्यकता नहीं है लागू करने के लिए चुना है, बस प्रपत्र के WindowState मूल्य की जाँच से पहले और बाद base.WndProc कहा जाता है:

protected override void WndProc(ref Message m) 
    { 
     FormWindowState org = this.WindowState; 
     base.WndProc(ref m); 
     if (this.WindowState != org) 
      this.OnFormWindowStateChanged(EventArgs.Empty); 
    } 

    protected virtual void OnFormWindowStateChanged(EventArgs e) 
    { 
     // Do your stuff 
    } 

निष्कर्ष - यह काम करता है।