2008-10-17 6 views
8

में सामने एक कंसोल विंडो लाएं मैं सी # में सामने कंसोल एप्लिकेशन विंडो कैसे ला सकता हूं (विशेष रूप से जब विजुअल स्टूडियो डीबगर चला रहा हो)?सी #

+0

किस संदर्भ में और आप ऐसा क्यों करना चाहते हैं? जबकि वैध मामले हैं, आमतौर पर इस तरह की चीज इसके लायक होने की तुलना में अधिक परेशानी होती है। – ICR

उत्तर

16

यह hacky है, यह भयानक है, लेकिन यह मेरे लिए काम करता (धन्यवाद, pinvoke.net!):

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Threading; 

public class Test 
{ 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool SetForegroundWindow(IntPtr hWnd); 

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

    public static void Main() 
    { 
     string originalTitle = Console.Title; 
     string uniqueTitle = Guid.NewGuid().ToString(); 
     Console.Title = uniqueTitle; 
     Thread.Sleep(50); 
     IntPtr handle = FindWindowByCaption(IntPtr.Zero, uniqueTitle); 

     if (handle == IntPtr.Zero) 
     { 
      Console.WriteLine("Oops, cant find main window."); 
      return; 
     } 
     Console.Title = originalTitle; 

     while (true) 
     { 
      Thread.Sleep(3000); 
      Console.WriteLine(SetForegroundWindow(handle)); 
     } 
    } 
} 
+0

डीबगिंग के दौरान इसे शीर्ष पर दिखाई देने के लिए कृपया इसे अपने कोड में कभी भी न जोड़ें। – tvanfosson

+1

@tv - शायद आप अपने पूर्ण बयान के लिए स्पष्टीकरण दे सकते हैं। व्यक्तिगत रूप से मुझे लगता है कि यह विंडो प्रबंधन कार्यों का एक वैध और अनुशंसित उपयोग है। यह सबसे अच्छा डीआरवाई दृष्टिकोण नहीं है लेकिन थोड़ा रिफैक्टरिंग के साथ यह Win32 अनुप्रयोग विकास में एक आम प्रथा है। यह हैकी नहीं है, इस तरह आप डेस्कटॉप के चारों ओर खिड़कियां ले जाते हैं। –

+0

बस जोड़ने के लिए, अगर आप केवल इस कोड को चलाने के लिए देख रहे थे जब दृश्य स्टूडियो डीबगर में आप निम्न का उपयोग कर सकते हैं: यदि (डीबगर। आईएसएटएटेड == सत्य) {...} –

1

दो पर नज़र रखता है जाओ (कम से कम) और माध्यमिक मॉनिटर में खुला VisualStudio। जब आप VisualStudio के भीतर से अपना ऐप चलाते हैं तो यह प्राथमिक मॉनीटर पर डिफ़ॉल्ट रूप से शुरू होगा। चूंकि यह खोला जाने वाला आखिरी ऐप है, यह शीर्ष पर शुरू होता है और विजुअलस्टूडियो पर बदलना इससे प्रभावित नहीं होता है। वैसे भी मेरे लिए काम करता है।

यदि आपके पास पहले से कोई दूसरा मॉनिटर नहीं है, तो IMHO, आपको चाहिए।

6

यही वह है जो मैं करता हूं।

[DllImport("kernel32.dll", ExactSpelling = true)] 
public static extern IntPtr GetConsoleWindow(); 

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

public void BringConsoleToFront() 
{ 
    SetForegroundWindow(GetConsoleWindow()); 
} 
0

काफी देर जवाब है, लेकिन मैं चारों ओर निम्नलिखित काम में इस्तेमाल किया:

आप Windows फार्म के साथ एक सांत्वना अनुप्रयोग चल रहे हैं, और आप प्रपत्र के सामने से सांत्वना लाना चाहते हैं, वहाँ ऐसा करने के लिए कोई रास्ता नहीं है, जैसा कि हमने ऊपर देखा है। हालांकि, विंडोज फॉर्म के साथ ऐसा करने का एक तरीका है - आप अपने कार्यक्रम में विंडो परतों को बदलने के लिए BringToFront() और SendToBack() का उपयोग कर सकते हैं। मेरे कार्यक्रम में एक फॉर्म और कंसोल था - कंसोल को आगे की तरफ होना आवश्यक था, इसलिए मैंने फॉर्म को पीछे भेज दिया।

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