2008-10-17 2 views
8

(특히 Visual Studio 디버거를 실행할 때) C#에서 콘솔 응용 프로그램 윈도우를 앞에 가져올 수 있습니까?콘솔 윈도우를 앞쪽으로 가져 오기 #

+0

어떤 상황에서 그리고 왜 이것을하고 싶습니까? 합법적 인 경우가 있지만 대개 이런 종류의 문제는 가치가있는 것보다 더 큰 문제입니다. – ICR

답변

16

그것은 끔찍한, 해키,하지만 나를 위해 작동 (감사, 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 - 어쩌면 당신은 절대적인 진술에 대해 설명 할 수 있습니다. 개인적으로 이것이 합법적이고 권장되는 창 관리 기능의 사용이라고 생각합니다. 가장 좋은 DRY 접근 방식은 아니지만 약간의 리팩토링을 통해 Win32 응용 프로그램 개발에있어 일반적인 관행입니다. 해키가 아니라 데스크톱 주위로 창을 이동하는 방법입니다. –

+0

Visual Studio 디버거에서만이 코드를 실행하려면 다음을 사용할 수 있습니다. if (Debugger.IsAttached == true) {...} –

1

는 두 개의 모니터를 가져옵니다 (적어도)와 보조 모니터에서 열려으로 VisualStudio. 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 Forms에서이 작업을 수행하는 방법이 있습니다. BringToFront()SendToBack()을 사용하여 프로그램의 창 레이어를 변경할 수 있습니다. 프로그램에는 양식과 콘솔이 있었고 콘솔이 앞에 있어야하므로 양식을 뒤쪽으로 보냈습니다.

사용자가 멀티 태스킹을하고 콘솔을 모든 것 앞에두고 싶다면 콘솔이 작동하지 않습니다. 그러나 프로그램의 창에 영향을 주려는 경우 적절한 해결 방법입니다.

관련 문제