2008-09-16 21 views
58

मेरे पास एक फॉर्म के साथ एक एप्लिकेशन है, और लोड विधि पर मुझे फॉर्म को छिपाने की आवश्यकता है।एकल फॉर्म स्टार्टअप पर छिपाएं

यह फ़ॉर्म खुद को प्रदर्शित करेगा (जब दृष्टिकोण 2003 शैली पॉपअप की रेखाओं के साथ सोचें), लेकिन मैं समझ सकता हूं कि बिना किसी गन्दा के लोड पर फ़ॉर्म को कैसे छिपाना है।

कोई सुझाव?

उत्तर

95

मैं इस पर सी # से आ रहा हूं, लेकिन vb.net में बहुत समान होना चाहिए।

Application.Run(new MainForm()); 

यह एक नया मुख्य रूप बनाता है और मुख्य रूप से जीवन भर के लिए आवेदन के जीवनकाल को सीमित करता है:

आपका मुख्य प्रोग्राम फ़ाइल में, मुख्य विधि में, आप की तरह कुछ करना होगा।

हालांकि, यदि आप एप्लिकेशन.रुन() पर पैरामीटर हटाते हैं, तो एप्लिकेशन को कोई भी फॉर्म दिखाया नहीं जाएगा और आप जितना चाहें फॉर्म को दिखाने और छिपाने के लिए स्वतंत्र होंगे।

लोड विधि में फ़ॉर्म को छिपाने की बजाय, प्रपत्र की दृश्यमान संपत्ति को डिज़ाइनर का उपयोग करके गलत तरीके से सेट करें। आप एप्लिकेशन को कॉल करने से पहले फॉर्म बना सकते हैं। Run(), मुझे लगता है कि फॉर्म में टास्क बार में एक आइकन प्रदर्शित करने के लिए उस पर एक नोटिफ़िकॉन होगा - यह तब भी प्रदर्शित किया जा सकता है जब फ़ॉर्म स्वयं दिखाई नहीं दे रहा है।

अपडेट: आप एप्लिकेशन को सेट करना भी चाहेंगे। ShutdownMode प्रॉपर्टी ShutdownMode.OnExplicitShutdown पर।

+12

तक दूर दूर तक सबसे अच्छा (और सरल में से एक) समाधान मैंने देखा है। सभी शून्य करने के लिए अस्पष्टता की स्थापना, अलग टाइमर उदाहरणों होने प्रपत्र आदि को छिपाने के लिए के बारे में कचरा दिनों के लिए कोड गंध है। – nathanchere

+0

इस विधि का उपयोग करना, यह अभी भी 'Process.MainWindowHandle' और तरह से मिल जाएगा? – Sebastian

+12

डिजाइनर के पास एक दृश्यमान संपत्ति नहीं है जहां तक ​​मैं देख सकता हूं। –

0

यहाँ एक सरल तरीका है:
यह सी # में है (मैं इस समय वीबी संकलक की जरूरत नहीं है)

public Form1() 
{ 
    InitializeComponent(); 
    Hide(); // Also Visible = false can be used 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    Thread.Sleep(10000); 
    Show(); // Or visible = true; 
} 
+0

यदि आप Form1_Load में शो लाइन नहीं जोड़ते हैं, तो फॉर्म किसी भी तरह दिखाया गया है, भले ही आप झूठी दिखाई देते हैं ... -1 –

+0

-1 यह काम नहीं करता है। आवेदन। रुन() फॉर्म को दिखाने के लिए आपके खिलाफ षड्यंत्र करता है चाहे कोई फर्क नहीं पड़ता। –

0

डिजाइनर में, गलत पर प्रपत्र के दर्शनीय गुण सेट। फिर जब तक आपको इसकी आवश्यकता न हो तब तक शो() को कॉल करने से बचें।

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

0

किसी फ़ॉर्म के बिना ऐप लॉन्च करने का मतलब है कि आपको एप्लिकेशन स्टार्टअप/शट डाउन को प्रबंधित करना होगा।

अदृश्य फॉर्म को शुरू करना एक बेहतर विकल्प है। जाहिर है

private void MainForm_Load(object sender, EventArgs e) 
{ 
    if (Settings.Instance.HideAtStartup) 
    { 
     BeginInvoke(new MethodInvoker(delegate 
     { 
      Hide(); 
     })); 
    } 
} 

तुम अपने साथ अगर हालत बदलने के लिए:

29

मैं इस का उपयोग करें।

+1

इससे प्रोग्राम चालू हो जाता है और फिर स्टार्टअप पर तुरंत छिप जाता है। –

+0

मुझे लगता है कि अगर मुझे आपका कोड नहीं दिखाई देगा तो मुझे इतना करना चाहिए। धन्यवाद –

+0

ऐप स्टार्टअप पर फ्लैश को संबोधित करने के लिए, डिज़ाइनर में फॉर्म अस्पष्टता 0 पर सेट करें, फिर कॉलबैक में, पहले छुपाएं() को कॉल करें और फिर ओपेसिटी को 100 पर सेट करें। –

0

यह उदाहरण सिस्टम अदृश्य में केवल अदृश्यता के साथ ही केवल NotifyIcon का समर्थन करता है और कोई क्लिक नहीं और बहुत कुछ।

अधिक यहाँ: http://code.msdn.microsoft.com/TheNotifyIconExample

-1

क्यों सब पर है कि जैसे कि यह करते हैं?

क्यों न केवल कंसोल ऐप की तरह शुरू करें और आवश्यक होने पर फॉर्म दिखाएं? एक फॉर्म ऐप से कंसोल ऐप को अलग करने के कुछ संदर्भों के अलावा कुछ भी नहीं है।

लालची होने की आवश्यकता नहीं है और जब आपको इसकी आवश्यकता भी नहीं हो सकती है तो स्मृति के लिए आवश्यक स्मृति लेना।

5

इस एक के साथ अपने मुख्य रूप बढ़ाएँ:

using System.Windows.Forms; 

namespace HideWindows 
{ 
    public class HideForm : Form 
    { 
     public HideForm() 
     { 
      Opacity = 0; 
      ShowInTaskbar = false; 
     } 

     public new void Show() 
     { 
      Opacity = 100; 
      ShowInTaskbar = true; 

      Show(this); 
     } 
    } 
} 

उदाहरण के लिए:

namespace HideWindows 
{ 
    public partial class Form1 : HideForm 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

इस लेख में और अधिक जानकारी (स्पेनिश):

http://codelogik.net/2008/12/30/primer-form-oculto/

+0

वेबसाइट ऑर्डर से बाहर है। –

-1

विभिन्न आधार पर सुझाव, मुझे बस इतना करना था:

रूप छिपाने के लिए:

Me.Opacity = 100 
Me.ShowInTaskbar = true 
+0

क्या होगा यदि उपयोगकर्ता गलती से पारदर्शी क्षेत्र में एंटर कुंजी या प्रकार हिट करता है? मुझे लगता है कि आपको * Me.Enable = false; * –

0
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    MainUIForm mainUiForm = new MainUIForm(); 
    mainUiForm.Visible = false; 
    Application.Run(); 
} 
+0

अभी भी बंद करने से पहले मुख्य विंडो को संक्षेप में दिखाता है। – Andy

79

आमतौर पर आप केवल इस लिए जब आप प्रदर्शित करने के लिए एक ट्रे आइकन या किसी अन्य विधि का उपयोग कर रहे कर रहे होते:

Me.Opacity = 0 
Me.ShowInTaskbar = false 

रूप दिखाने के लिए बाद में फॉर्म, लेकिन यह अच्छी तरह से काम करेगा भले ही आप अपना मुख्य रूप कभी प्रदर्शित न करें।

अपने फार्म कक्षा में एक bool कि गलत पर चूक है बनाएँ:

private bool allowshowdisplay = false; 

फिर SetVisibleCore विधि

protected override void SetVisibleCore(bool value) 
{    
    base.SetVisibleCore(allowshowdisplay ? value : allowshowdisplay); 
} 

Application.Run() रूपों सेट क्योंकि .Visible = के बाद सच को ओवरराइड यह फ़ॉर्म को लोड करता है जो इसे रोक देगा और इसे गलत पर सेट करेगा। उपर्युक्त मामले में, यह हमेशा इसे झूठी पर सेट करेगा जब तक कि आप इसे अनुमति देने के लिए अनुमति नहीं देते हैं।

अब यह प्रपत्र स्टार्टअप पर प्रदर्शित होने से रोक देगा, अब आपको SethisibleCore को allowhowdisplay = true सेट करके ठीक से काम करने की आवश्यकता है। आप इसे जो भी यूजर इंटरफेस फ़ंक्शन पर प्रदर्शित करना चाहते हैं, वह फॉर्म प्रदर्शित करता है। मेरे उदाहरण में यह मेरी notiyicon वस्तु में छोड़ दिया क्लिक करें घटना है:

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     this.allowshowdisplay = true; 
     this.Visible = !this.Visible;     
    } 
} 
+1

धन्यवाद! यहां लगभग सभी अन्य सुझावों के विपरीत, यह मुख्य विंडो का एक संक्षिप्त फ्लैश नहीं दिखाता है। – Andy

+0

यह करने का यह सही सही तरीका है, इसलिए यह स्वीकार्य उत्तर होना चाहिए। एमएफसी दिनों में हम एक समान काम करते थे जहां हम पहले WM_WINDOWPOSCHANGING संदेश को संभालेंगे और "विंडो फ्लैशिंग" को रोकने के लिए फॉर्म को छुपाएंगे। – enriquein

+0

धन्यवाद मैंने स्वीकार्य उत्तर की कोशिश की और यह काम नहीं किया क्योंकि मुझे ट्रे आइकन दिखाने की ज़रूरत है, हालांकि यह पूरी तरह से काम करता है। –

10

प्रपत्र निर्माण समय (डिजाइनर, कार्यक्रम मुख्य, या फॉर्म निर्माता, अपने लक्ष्यों के आधार पर) पर,

this.WindowState = FormWindowState.Minimized; 
this.ShowInTaskbar = false; 

जब आप अपने NotifyIcon से घटना पर प्रपत्र को दिखाने के लिए, शायद जरूरत है, के रूप में आवश्यक रिवर्स

if (!this.ShowInTaskbar) 
    this.ShowInTaskbar = true; 

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

लगातार दिखाएँ/छिपाएँ घटनाओं अधिक बस फार्म के दर्शनीय संपत्ति या दिखाएँ/छुपाएँ तरीकों का उपयोग कर सकते हैं।

+0

पढ़ने के लिए 3 प्रयास किए गए हैं, यह लोड ईवेंट में भी काम करता है। मुझे लगता है कि यह वही तरीका है जिसका इरादा था। –

0

रूप Groky's response के पूरक हम भी (ApplicationContext वर्ग है, जो भी अनुमति देता है का उल्लेख कर सकता है (के रूप में यह लेख के नमूने में दिखाया गया है) दो खोलने की क्षमता या यहाँ तक कि (जो वास्तव में अब तक मेरी परिप्रेक्ष्य में से सबसे अच्छी प्रतिक्रिया है) अधिक) आवेदन स्टार्टअप पर फॉर्म, और उन सभी के साथ आवेदन जीवनकाल को नियंत्रित करें।

15
protected override void OnLoad(EventArgs e) 
    { 
     Visible = false; // Hide form window. 
     ShowInTaskbar = false; // Remove from taskbar. 
     Opacity = 0; 

     base.OnLoad(e); 
    } 
+0

मैं चाहता हूं कि मेरा फॉर्म छुपाया जाए लेकिन अभी भी लोड हो रहा है और चल रहा है। यह समाधान इस तरह के मामले में पूरी तरह से काम करता है। आप के लिए अपवित्र! –

3

मैंने इस मुद्दे से बहुत संघर्ष किया है और समाधान हालांकि मेरे मुकाबले बहुत आसान है। मैंने पहली बार यहां सभी सुझावों का प्रयास किया लेकिन फिर मैं परिणाम से संतुष्ट नहीं था और थोड़ा और जांच की। मैंने पाया कि मैं जोड़ने: ठीक

this.visible=false; 
/* to the InitializeComponent() code just before the */ 
this.Load += new System.EventHandler(this.DebugOnOff_Load); 

यह काम कर रहा है। लेकिन मैं एक और अधिक सरल समाधान चाहता था और इसे बाहर बारी है कि यदि आप जोड़ें: मैं इसे इस तरह करते हैं

this.visible=false; 
/* to the start of the load event, you get a 
simple perfect working solution :) */ 
private void 
DebugOnOff_Load(object sender, EventArgs e) 
{ 
this.Visible = false; 
} 
-2

- सबसे आसान तरीका है देखने के अपनी बात से: फ़ॉर्म की 'StartPosition' सेट

'मैन्युअल' करने के लिए, और फार्म के डिजाइनर से जोड़ें:

Private Sub InitializeComponent() 
. 
. 
. 
Me.Location=New Point(-2000,-2000) 
. 
. 
. 
End Sub 

सुनिश्चित करें कि स्थान से परे या स्क्रीन के आयामों नीचे कुछ पर सेट है। बाद में, जब आप फॉर्म दिखाना चाहते हैं, तो स्क्रीन के आयामों में स्थान को कुछ सेट करें।

2

आप गलत पर टास्कबार में कम से कम करने के लिए खिड़की राज्य, और शो सेट करना चाहते हैं जा रहे हैं। फिर अपने रूपों के अंत में सेट लोड खिड़की राज्य को बड़ा किया और सच

public frmMain() 
    { 
     Program.MainForm = this; 
     InitializeComponent(); 

     this.WindowState = FormWindowState.Minimized; 
     this.ShowInTaskbar = false; 
    } 

private void frmMain_Load(object sender, EventArgs e) 
    { 
     //Do heavy things here 

     //At the end do this 
     this.WindowState = FormWindowState.Maximized; 
     this.ShowInTaskbar = true; 
    } 
3

रूप में अच्छी तरह कार्य पट्टी से एप्लिकेशन को छिपाने की कोशिश टास्कबार में दिखाने के लिए।

ऐसा करने के लिए है कि इस कोड का इस्तेमाल करें।

protected override void OnLoad(EventArgs e) 
    { 
    Visible = false; // Hide form window. 
    ShowInTaskbar = false; // Remove from taskbar. 
    Opacity = 0; 

    base.OnLoad(e); 
    } 

धन्यवाद। रुहुल

0

यह मेरे लिए पूरी तरह से काम करता है:

[STAThread] 
    static void Main() 
    { 
     try 
     { 
      frmBase frm = new frmBase();    
      Application.Run(); 
     } 

जब मैं परियोजना लॉन्च करते हैं, सब कुछ टास्कबार में सहित जब तक मैं यह दिखाने की जरूरत है छिपा हुआ था ..

0

अवहेलना फार्म

में OnVisibleChanged
protected override void OnVisibleChanged(EventArgs e) 
{ 
    this.Visible = false; 

    base.OnVisibleChanged(e); 
} 

यदि आप इसे किसी बिंदु पर

पर दिखाने की आवश्यकता हो तो आप ट्रिगर जोड़ सकते हैं
public partial class MainForm : Form 
{ 
public bool hideForm = true; 
... 
public MainForm (bool hideForm) 
    { 
     this.hideForm = hideForm; 
     InitializeComponent(); 
    } 
... 
protected override void OnVisibleChanged(EventArgs e) 
    { 
     if (this.hideForm) 
      this.Visible = false; 

     base.OnVisibleChanged(e); 
    } 
... 
} 
संबंधित मुद्दे