2009-11-13 12 views
41

मैंने सफलतापूर्वक एक ऐप बनाया है जो नोटिफ़िकॉन का उपयोग कर ट्रे को कम करता है। जब फॉर्म मैन्युअल रूप से बंद हो जाता है तो इसे डेस्कटॉप, टास्कबार और alt-tab से सफलतापूर्वक छुपाया जाता है। ऐप के साथ शुरू करने की कोशिश करते समय समस्या तब होती है। सबसे पहले समस्या यह थी कि ऐप को कम किया जाएगा लेकिन अभी भी alt-tab संवाद में दिखाई देगा। FormWorderStyle को टूलविंडो विकल्पों में से किसी एक में बदलना ("कोई नहीं" विकल्प से) इसे ठीक किया गया, लेकिन एक और समस्या पेश की गई। जब ऐप पहली बार कम से कम विंडो के टाइटलबार को प्रारंभ मेनू से ऊपर दिखाई देता है:WinForm ऐप को ट्रे में कम से कम कैसे शुरू करें?

Pic http://i38.tinypic.com/2wny811.gif

फॉर्म खोलना और बंद करना इसे ठीक से छिपाने का कारण बनता है। मैंने कई बदलावों की कोशिश की है, लेकिन यहां अनिवार्य रूप से यह अभी काम कर रहा है ...

विंडोस्टेट डिजाइनर में न्यूनतम करने के लिए सेट है।

this.Visible = false; 
this.ShowInTaskbar = false; 

जब NotifyIcon डबल-क्लिक मैं निम्नलिखित है::

this.WindowState = FormWindowState.Normal; 
this.Visible = true; 
this.ShowInTaskbar = true; 

जैसा कि मैंने कहा, मैं मामूली बदलाव के बहुत सारे की कोशिश की है निर्माता में कुछ आरंभीकरण बाद मैं निम्नलिखित लाइनों है इस पर (यह। हाइड(), आदि)। क्या NotifyIcon प्राथमिक घटक होने का कोई तरीका है जैसे कि NotifyIcon चलते समय मैं फ़ॉर्म को पूरी तरह से शुरू और निपटान कर सकता हूं? किसी भी अजीबता के बिना कम से कम फॉर्म के साथ ऐप शुरू करने का एक तरीका बनना होगा। कृपया इसे ढूंढने में मेरी मदद करें!

this.Visible = false; 
this.ShowInTaskbar = false; 

और InitializeComponent(); के बाद जोड़ें::

उत्तर

70

ऐसा करने का सही तरीका है कि फ़ॉर्म को पहले स्थान पर दिखने से रोकें। इसके लिए SetVisibleCore() को ओवरराइड करने की आवश्यकता है। चलो एक शो और निकास कमांड के साथ NotifyIcon के लिए एक संदर्भ मेनू मान लें। आप इसे इस तरह लागू कर सकते हैं:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     notifyIcon1.ContextMenuStrip = contextMenuStrip1; 
     this.showToolStripMenuItem.Click += showToolStripMenuItem_Click; 
     this.exitToolStripMenuItem.Click += exitToolStripMenuItem_Click; 
    } 

    private bool allowVisible;  // ContextMenu's Show command used 
    private bool allowClose;  // ContextMenu's Exit command used 

    protected override void SetVisibleCore(bool value) { 
     if (!allowVisible) { 
      value = false; 
      if (!this.IsHandleCreated) CreateHandle(); 
     } 
     base.SetVisibleCore(value); 
    } 

    protected override void OnFormClosing(FormClosingEventArgs e) { 
     if (!allowClose) { 
      this.Hide(); 
      e.Cancel = true; 
     } 
     base.OnFormClosing(e); 
    } 

    private void showToolStripMenuItem_Click(object sender, EventArgs e) { 
     allowVisible = true; 
     Show(); 
    } 

    private void exitToolStripMenuItem_Click(object sender, EventArgs e) { 
     allowClose = true; 
     Application.Exit(); 
    } 
} 

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

+0

शानदार, धन्यवाद! अपने विशिष्ट ऐप के साथ काम करने के लिए थोड़ा tweaking लिया, लेकिन यह बहुत अच्छा काम करता है! – jluce50

+0

ग्रेट सॉल्यूशन हंस, धन्यवाद। – Segfault

+0

एक आकर्षण की तरह काम करता है! – psulek

16

निर्माता में, इन दो पंक्तियों को दूर

this.WindowState = FormWindowState.Minimized; 

डिजाइनर में, Normal करने के लिए false & FormWindowState करने के लिए ShowInTaskbar निर्धारित किया है।

संपादित करें: यदि आप लोड ईवेंट में इसे पोस्ट करते हैं, तो विंडो कम हो जाती है लेकिन फिर भी डेस्कटॉप पर कम से कम दिखाती है। मुझे लगता है कि यह एक बग है।

+2

या प्रपत्र लोड घटना में, के बाद से निर्माता डिजाइनर उत्पन्न है और आप ' अब और फिर आपके परिवर्तन में आपका परिवर्तन गायब हो गया है। –

+0

मैं मानता हूं, लोड इवेंट एक बेहतर जगह होगी – Miles

+0

मेरा संपादन देखें। आपका परिवर्तन तभी गायब हो जाएगा यदि आप उस पंक्ति को पोस्ट करते हैं जिसे मैंने 'प्रारंभिक कॉम्पोनेंट();' से पहले पोस्ट किया है। आपकी सभी डिज़ाइनर सेटिंग्स 'प्रारंभिक कॉम्पोनेंट();' में लोड की गई हैं। – Yogesh

2

किसी एप्लिकेशन को कम करने और आप Alt + टैब से छिपाना चाहते हैं:

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

पर कम से कम घटना:

this.Visible = false; 
this.Opacity = 0; 
this.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
this.ShowInTaskbar = false; 

मानक के अनुसार घटना पर:

this.Visible = true; 
this.Opacity = 100; 
this.FormBorderStyle = FormBorderStyle.FixedSingle; //or whatever it was previously set to 
this.ShowInTaskbar = true; 
+0

बहुत अच्छा! धन्यवाद। – Damien

12

मैं सभी जवाब पढ़ रहा हूँ और हैक्स और काला जादू ... (कोई अपराध, साथियों)

देखना

दोस्तों, कोई हैक की आवश्यकता नहीं है। आपको "ShowInTaskbar = false" और अन्य सामान सेट करने की भी आवश्यकता नहीं है। बस इस कार्य करें:

//"Form Shown" event handler 
    private void Form_Shown(object sender, EventArgs e) 
    { 
     //to minimize window 
     this.WindowState = FormWindowState.Minimized; 

     //to hide from taskbar 
     this.Hide(); 
    } 

नोट: मैं दृढ़ता से नहीं "ShowInTaskbar" संपत्ति छू सलाह देते हैं। उदाहरण के लिए, यदि आपका एप्लिकेशन सिस्टम-व्यापी हॉटकी या अन्य समान सामान (हुक, इत्यादि) पंजीकृत करता है - ShowInTaskBar = झूठी सेटिंग और आपके ऐप को कम करने से विंडोज़ आपके संदेशों को कुछ संदेश भेजने से रोक देगा ... और आपके हुक/हॉटकी/इत्यादि काम करना बंद करो।

+0

क्या यह ओपी के अनुरोध के रूप में ट्रे में आइकन दिखाएगा? – WEFX

+0

मैं अपने कार्यक्रम के लिए यह कैसे करना है इस पर शोध कर रहा था और यह मेरा लक्ष्य पूरा करने का सबसे आसान और प्रभावी तरीका था। – Brad

+0

@ ब्रैड नो, आपको अभी भी मैन्युअल रूप से NotifyIcon जोड़ने की आवश्यकता है। लेकिन आइकन जोड़ने के बाद यह चाल चल जाएगा। – user2404597

0

यह "त्वरित और गंदी ठीक" मेरे लिए काम किया:

$form1.FormBorderStyle = "fixedtoolwindow" 
$form1.top = -1000000 
$form1.Left = -1000000 
$form1.Width = 10 
$form1.Height = 10 
$form1.WindowState = "normal" 
$form1.ShowInTaskbar = $False 
$form1.Opacity = 0 
$form1.Hide() 

आशा है कि यह किसी और में मदद करता है ...

+0

वह भाषा क्या है? – LarsTech