2009-02-06 17 views
10

मेरे पास एक ऐसा प्रोग्राम है जिसे केवल इच्छित के रूप में काम करने के लिए नोटिफ़िकॉन की आवश्यकता है। तो जब प्रोग्राम शुरू होता है तो मैं मुख्य रूप से छुपाने की कोशिश कर रहा हूं।प्रक्षेपण पर प्रपत्र छिपाएं

frmMain_Load में, मैं सफलता के बिना दोनों

this.Hide(); 
this.Visible = false; 

की कोशिश की।

वे अन्य तरीकों से काम करते हैं, जैसे NotifyIcon_MouseClick-method में, लेकिन मैं इसे लोड पर छिपाना चाहता हूं।

मैं अतः यहाँ एक और सवाल में देखा था जहां मटीस इस सुझाव:

BeginInvoke(new MethodInvoker(delegate 
{ 
    Hide(); 
})); 

यह काम करता है, लेकिन जब मैं कार्यक्रम शुरू मैं प्रपत्र असली तेजी से चमकती देख सकते हैं। यह कुछ भी नहीं है, लेकिन मुझे आश्चर्य है कि इसके लिए कोई बेहतर समाधान है या नहीं।

धन्यवाद।

उत्तर

15
// In Your Program.cs Convert This 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

// To This 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Form1 TheForm = new Form1(); 
    Application.Run(); 
} 

// Call Application.Exit() From Anywhere To Stop Application.Run() Message Pump and Exit Application 
+0

इस समाधान में एक समस्या है। इस मामले में, जब आप फॉर्म को बंद करते हैं, तो 'फॉर्मक्लोस' और 'फॉर्मक्लोसिंग' ईवेंट नहीं बढ़ेगा। – parseh

+0

एक्स बटन का उपयोग करते हुए फॉर्म बंद होने पर आप एप्लिकेशन से बाहर कैसे निकल सकते हैं? –

+0

एक बेहतर समाधान 'एप्लिकेशन कॉन्टेक्स्ट' बनाना है, और इसका एक उदाहरण 'एप्लिकेशन.रुन()' है, जो फॉर्म के जीवन चक्र का प्रबंधन करता है जिससे 'एप्लिकेशन.एक्सिट()' कहीं और कॉल करने की आवश्यकता से परहेज किया जाता है। –

2

अपने फॉर्म पर शो या शोडियलॉग को कॉल न करें, तो आप अपना आवेदन कर सकते हैं। एक कस्टम क्लास को लक्षित करें जो तब फॉर्म को तुरंत चालू करता है और नोटिफ़िकॉन उदाहरण नहीं दिखाता या बनाता है और वहां से सबकुछ संभालता है।

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault (false); 
    Application.Run (new MainForm()); 
} 

Run बुलाने की साधारण तथ्य यह है, वास्तव में प्रपत्र जाहिर कर देंगे:

+0

आप, साथ ही Application.Run कॉल कर सकते हैं() किसी भी पैरामीटर के बिना। जब आपका आवेदन समाप्त हो जाता है तो आवेदन करें।बाहर जाएं(); – VBNight

+0

यह काम नहीं करेगा यदि आपको कुछ घटना अधिसूचनाएं प्राप्त करने की आवश्यकता है, जैसे कि बिजली की घटनाएं, आदि जहां आपको वास्तव में उन्हें प्राप्त करने के लिए एक (अदृश्य) रूप की आवश्यकता होती है। –

+0

आपके उत्तर के लिए धन्यवाद। क्या मुझे अपनी खुद की कस्टम फॉर्म क्लास बनाना है या क्या मैं सिर्फ शो() - लाइन को हटा सकता हूं? अगर मुझे अपनी खुद की कस्टम क्लास बनाना है, तो मैं यह कैसे कर सकता हूं? मैं कोड में चारों ओर देख रहा हूं लेकिन मुझे कुछ भी दिलचस्प नहीं लगता है। – sippa

5

एक आसान तरीका भी है, यदि आपके प्रोग्राम को डिफ़ॉल्ट दृश्य स्टूडियो Program.cs फ़ाइल उत्पन्न किया है। आपके प्रपत्र के गुणों में निम्न कार्य का प्रयास करें:

  1. सेट WindowStateMinimized को
  2. ShowInTaskbarfalse को

सेट इस चाल करना चाहिए!

+0

आपके उत्तर के लिए धन्यवाद! मैं यह उल्लेख करना भूल गया कि मैंने पहले ही इस तरह से कोशिश की है। यह आंशिक रूप से काम करता था, लेकिन मैं नीचे बाएं कोने में फॉर्म टाइटल बार देख सकता था, इसलिए मैं इसे किसी अन्य तरीके से करना चाहता हूं। फिर भी धन्यवाद! – sippa

1

आप form.hshown ईवेंट में यह.hide = true भी डाल सकते हैं। मेरा मानना ​​है कि घटना केवल लोड घटना के बाद और बाद में निकाल दी जाती है। आप अजीब झिलमिलाहट देख सकते हैं हालांकि यदि आपके फॉर्म में बहुत सारे नियंत्रण हैं और/या कंप्यूटर धीमा है।

+0

मैंने अभी यह कोशिश की, और जब यह काम करता है तब भी आप वास्तव में चमकते हुए फॉर्म को देख सकते हैं। मैं इसे पूरी तरह से ठीक करना चाहता हूं, लेकिन आपके सुझाव के लिए धन्यवाद! – sippa

1

यदि आपके प्रोग्राम को चलाने के लिए किसी फॉर्म की आवश्यकता नहीं है, तो सबसे अच्छी विधि यह नहीं है कि कोई फॉर्म न हो। प्रोग्राम कोड में अपना नोटिफ़िकेशन सेटअप करें, और जब तक आप कुछ मूल्य निर्धारित करके प्रोग्राम को बाहर निकलना नहीं चाहते हैं, या कुछ विधि कॉल करके एक लूप दर्ज करें। इस उदाहरण में UserExit को सही करने के लिए सेट किया गया (Program.UserExitCalled = true) प्रोग्राम को छोड़ने का कारण बन जाएगा। यहाँ एक संक्षिप्त उदाहरण है:

static class Program { 
    internal static Boolean UserExitCalled; 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     // Setup your tray icon here 

     while (!UserExitCalled) { 
      Application.DoEvents(); // Process windows messages 
      Thread.Sleep(1); 
     } 

     return; 
    } 
} 

यहाँ एक काम कर उदाहरण के रूप में अपने सिस्टम ट्रे अनुप्रयोगों में से एक से पूरा कार्यक्रम वर्ग।

// ********************************************************************* 
// [DCOM Productions .NET] 
// [DPDN], [Visual Studio Launcher] 
// 
// THIS FILE IS PROVIDED "AS-IS" WITHOUT ANY WARRANTY OF ANY KIND. ANY 
// MODIFICATIONS TO THIS FILE IN ANY WAY ARE YOUR SOLE RESPONSIBILITY. 
// 
// [Copyright (C) DCOM Productions .NET All rights reserved.] 
// ********************************************************************* 

namespace VisualStudioLauncher 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Windows.Forms; 
    using System.Threading; 
    using VisualStudioLauncher.Common.Objects; 
    using VisualStudioLauncher.Forms; 
    using System.Drawing; 
    using VisualStudioLauncher.Common.Data; 
    using System.IO; 
static class Program 
{ 
    #region Properties 

    private static ProjectLocationList m_ProjectLocationList; 
    /// <summary> 
    /// Gets or Sets the ProjectsLocationList 
    /// </summary> 
    public static ProjectLocationList ProjectLocationList 
    { 
     get 
     { 
      return m_ProjectLocationList; 
     } 

     set 
     { 
      m_ProjectLocationList = value; 
     } 
    } 

    private static ShellProcessList m_ShellProcessList = null; 
    /// <summary> 
    /// Gets or Sets the ShellProcessList 
    /// </summary> 
    public static ShellProcessList ShellProcessList 
    { 
     get 
     { 
      return m_ShellProcessList; 
     } 

     set 
     { 
      m_ShellProcessList = value; 
     } 
    } 

    private static NotifyIcon m_TrayIcon; 
    /// <summary> 
    /// Gets the programs tray application. 
    /// </summary> 
    public static NotifyIcon TrayIcon 
    { 
     get 
     { 
      return m_TrayIcon; 
     } 
    } 

    private static bool m_UserExitCalled; 
    /// <summary> 
    /// Gets a value indicating whether the user has called for an Application.Exit 
    /// </summary> 
    public static bool UserExitCalled 
    { 
     get 
     { 
      return m_UserExitCalled; 
     } 

     set 
     { 
      m_UserExitCalled = value; 
     } 
    } 

    // TODO: Finish implementation, then use this for real. 
    private static ApplicationConfiguration m_ApplicationConfiguration = null; 
    /// <summary> 
    /// Gets the application configuration 
    /// </summary> 
    public static ApplicationConfiguration ApplicationConfiguration 
    { 
     get 
     { 
      if (m_ApplicationConfiguration == null) 
       m_ApplicationConfiguration = ApplicationConfiguration.LoadConfigSection(@"./settings.config"); 

      return m_ApplicationConfiguration; 
     } 
    } 


    #endregion 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main(string[] args) 
    { 
     if (args.Length > 0) 
     { 
      if (args[0].ToLower() == "-rmvptr") 
      { 
       for (int i = 1; i < args.Length; i++) { 
        try { 
         if (File.Exists(Application.StartupPath + @"\\" + args[i])) { 
          File.Delete(Application.StartupPath + @"\\" + args[i]); 
         } 
        } 
        catch { /* this isn't critical, just convenient */ } 
       } 
      } 
     } 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     SplashForm splashForm = new SplashForm(); 
     splashForm.Show(); 

     while (!UserExitCalled) 
     { 
      Application.DoEvents(); 
      Thread.Sleep(1); 
     } 

     if (m_TrayIcon != null) 
     { 
      m_TrayIcon.Icon = null; 
      m_TrayIcon.Visible = false; 
      m_TrayIcon.Dispose(); 

      GC.Collect(); 
     } 
    } 

    #region System Tray Management 

    public static void SetupTrayIcon() 
    { 
     m_TrayIcon = new NotifyIcon(); 
     m_TrayIcon.Text = Resources.UserInterfaceStrings.ApplicationName; 
     m_TrayIcon.Visible = false; // This will be set visible when the context menu is generated 
     m_TrayIcon.MouseDoubleClick += new MouseEventHandler(m_TrayIcon_MouseDoubleClick); 

     if (Orcas.IsInstalled) 
     { 
      m_TrayIcon.Icon = Orcas.Icon; 
     } 
     else if (Whidbey.IsInstalled) { 
      m_TrayIcon.Icon = Whidbey.Icon; 
     } 
     else { 
      m_TrayIcon.Icon = SystemIcons.Warning; 
      m_TrayIcon.Text = "Visual Studio is not installed. VSL cannot run properly."; 
     } 
    } 

    static void m_TrayIcon_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button != MouseButtons.Left) 
     { 
      return; 
     } 

     SettingsForm settingsForm = new SettingsForm(); 
     settingsForm.Show(); 
    } 

    #endregion 
} 

}

+0

जब तक आप एप्लिकेशन को कॉल नहीं करते हैं। मुझे नहीं लगता कि संदेश लूप/पंप शुरू हो जाएगा। – VBNight

+0

आप एप्लिकेशन को कॉल करके संदेशों को संसाधित कर सकते हैं। DoEvents()। चूंकि यह एक जटिल परिदृश्य नहीं है, इसलिए उसे एक फॉर्म घोषित करने की आवश्यकता नहीं है, फिर भी एप्लिकेशन का उपयोग कर संदेश लूप चलाएं। रुन() "अगर आपको अपने कोड में इसकी आवश्यकता नहीं है, तो इसे हटा दें।" विशेष रूप से उत्पादन कोड में। –

1

मैं इसे किया है सिर्फ इस संपत्ति को बदलने: Application.OpenForms["Form1"].Opacity = 0;

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^