2009-04-15 15 views
11

में नेट कंसोल एप्लिकेशन क्या कोई तरीका है जब मैं कम से कम सिस्टम ट्रे में कंसोल एप्लिकेशन डाल सकता हूं?सिस्टम ट्रे

मैं नेट 3.5 का उपयोग ग #

+2

नहीं, एक डुप्ली नहीं। एक कंसोल एप्लिकेशन के बारे में यह वार्ता, एक Winform आवेदन नहीं! – Sascha

+0

वास्तव में, मैं वापस डुप्ली सुझाव लेता हूं। यह एक कंसोल एप्लिकेशन के बारे में एक प्रश्न है जो – JaredPar

+0

हैलो, मैं भी ऊपर के लिए समाधान चाहता हूं ... मैंने FindWindow फ़ंक्शन तक "CLARGe" सुझाव का प्रयास किया है ... लेकिन आगे बढ़ नहीं सकता क्योंकि एमएसडीएन पर विशिष्ट उदाहरण नहीं हैं "... कंसोल ऑनस्क्रीन है, कम से कम बटन पर क्लिक करें और कंसोल विंडो को छिपाने के लिए इसका इस्तेमाल करें और अधिसूचना आइकन अपडेट करें .." क्या कोई भी कंसोल को कम करने के तरीके पर कोड के साथ सुझाव दे सकता है बटन क्लिक करें और छुपाएं कंसोल विंडो और अधिसूचना आइकन अद्यतन करें। किसी भी सुझाव के लिए बहुत आभार होगा। –

उत्तर

8

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

लेकिन: मुझे यकीन है कि तुम क्यों ऐसा करना चाहते हैं नहीं कर रहा हूँ। एक कंसोल एप्लिकेशन एक विंडोज़ अनुप्रयोग के लिए डिजाइन द्वारा अलग है। इसलिए, हो सकता है कि ऐप को विंडोज़ फॉर्म एप्लिकेशन के रूप में बदलने का विकल्प हो?

0

आप कंसोल एप्लिकेशन को छुपा नहीं सकते हैं क्योंकि इसमें वास्तव में एक विंडो नहीं है, यह देखने के लिए कि कंसोल में यह कैसा चल रहा है (कंसोल स्वयं कंसोल की एक खिड़की है, न कि इसमें ऐप चल रहा है)

20

हाँ, आप यह कर सकते हैं। विंडोज फॉर्म एप्लिकेशन बनाएं और NotifyIcon component जोड़ें।

फिर, निम्न विधियों (found on MSDN) आवंटित करने के लिए इस्तेमाल करते हैं और एक कंसोल

[DllImport("kernel32.dll")] 
public static extern Boolean AllocConsole(); 

[DllImport("kernel32.dll")] 
public static extern Boolean FreeConsole(); 

[DllImport("kernel32.dll")] 
public static extern Boolean AttachConsole(Int32 ProcessId); 

प्रदर्शित जब अपने कंसोल परदे पर है छोटा करें बटन क्लिक पर कब्जा और इसका इस्तेमाल कंसोल विंडो को छिपाने के लिए और सूचित करें आइकन अद्यतन करें। आप निम्न विधियों (found on MSDN) का उपयोग कर अपने खिड़की पा सकते हैं:

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter. 
// Also consider whether you're being lazy or not. 
[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)] 
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 

FreeConsole कॉल करने के लिए जब भी आप ऐप्स को बंद करने के लिए तैयार हैं सुनिश्चित करें।

1
[DllImport("user32.dll")] 
internal static extern bool SendMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam); 
static Int32 WM_SYSCOMMAND = 0x0112; 
static Int32 SC_MINIMIZE = 0x0F020; 

static void Main(string[] args) 
{ 
    SendMessage(Process.GetCurrentProcess().MainWindowHandle, WM_SYSCOMMAND, SC_MINIMIZE, 0); 
} 
+2

यह कोड केवल कंसोल को कम करता है। –

2

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

+0

विंडोज 10 ने ट्रेवेयर को मैलवेयर के रूप में रिपोर्ट किया ... – mafrosis

+1

विंडोज 10 मैलवेयर है। :-) TrayRunner के लिए, मुझे लगता है कि यह पुराना है और माइक्रोसॉफ्ट से कुछ नई आवश्यकता के अनुरूप नहीं है। यह निश्चित रूप से मैलवेयर नहीं है। –

+0

काम पाने के लिए सबसे तेज़ तरीका। हालांकि सुंदर नंगे हड्डियों का उपकरण। –

2
using System.Windows.Forms; 
using System.Drawing; 

static NotifyIcon notifyIcon = new NotifyIcon(); 
static bool Visible = true; 
static void Main(string[] args) 
{ 
    notifyIcon.DoubleClick += (s, e) => 
    { 
     Visible = !Visible; 
     SetConsoleWindowVisibility(Visible); 
    }; 
    notifyIcon.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); 
    notifyIcon.Visible = true; 
    notifyIcon.Text = Application.ProductName; 

    var contextMenu = new ContextMenuStrip(); 
    contextMenu.Items.Add("Exit", null, (s, e) => { Application.Exit(); }); 
    notifyIcon.ContextMenuStrip = contextMenu; 

    Console.WriteLine("Running!"); 

    // Standard message loop to catch click-events on notify icon 
    // Code after this method will be running only after Application.Exit() 
    Application.Run(); 

    notifyIcon.Visible = false; 
} 

[DllImport("user32.dll")] 
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
public static void SetConsoleWindowVisibility(bool visible) 
{ 
    IntPtr hWnd = FindWindow(null, Console.Title); 
    if (hWnd != IntPtr.Zero) 
    { 
     if (visible) ShowWindow(hWnd, 1); //1 = SW_SHOWNORMAL   
     else ShowWindow(hWnd, 0); //0 = SW_HIDE    
    } 
} 
संबंधित मुद्दे