2011-10-12 2 views
3

특정 인수가 전달되면 콘솔 응용 프로그램으로 사용할 수있는 WinForm 프로젝트가 있습니다. 여기에서 읽은 팁을 사용하여 다음 코드를 사용하여이 작업을 수행했습니다.WinForm/Console 하이브리드 응용 프로그램의 동작

[System.Runtime.InteropServices.DllImport("kernel32.dll")] 
private static extern bool AllocConsole(); 

[System.Runtime.InteropServices.DllImport("kernel32.dll")] 
private static extern bool AttachConsole(int pid); 

... 

if (!AttachConsole(-1)) 
{ 
    AllocConsole(); 
} 

이 작동하지만, 하나의 성가신 부작용이 - 모든 출력이 백그라운드 스레드에서 생성 된 것으로 보인다는. 명령 프롬프트에서 프로그램을 실행하면 결과를 표시하기 전에 다음 프롬프트가 출력됩니다.

프로젝트 속성의 출력 유형을 콘솔 응용 프로그램으로 설정하고이 문제를 해결했지만 이제는 'WinForm 모드'로 실행되는 경우에도 항상 콘솔 창이 표시됩니다.

프로그램이 WinForm을 표시 할 때 프로그램이 현재 프로세스이고 콘솔 창이 표시되지 않는 것처럼 콘솔이 작동하는 환경을 최대한 활용할 수있는 방법이 있습니까?

업데이트 : 불편을 끼쳐 드려 죄송합니다. 내가 잘못하고 봤는데

어쩌면
// nowin is a bool that is set based on a parameter 
if (nowin) 
{ 
    if (!AttachConsole(-1)) 
    { 
     AllocConsole(); 
    } 
    //... Console mode code here... 
} 
else 
{ 
    // run in window 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1(argDict)); 
} 
+0

발견 한 것은 현재 WinForm 응용 프로그램이 작동하는 "부작용"이 아닙니다. 당신이 별도의 프로그램을 가지고 있다면 그것은 훨씬 쉬울 것입니다. 이것이 가능하도록 응용 프로그램을 설계하십시오. –

+1

[cmd에서 실행할 때 콘솔 및 winforms 응용 프로그램 간의 차이점] 가능한 복제본 (http://stackoverflow.com/questions/7613880/difference-between-console-and-winforms-applications-when-running-from-cmd) –

답변

1

주변에 길이없는 것처럼 보입니다. 1) 콘솔 모드의 출력을 전용 콘솔 앱처럼 동작 시키려면 콘솔 창이 항상 있어야합니다. 2) 윈도우 모드에서 콘솔을 실행할 때 콘솔을 숨기려면 차단 인쇄물이 사라집니다.

6

하지만 난 항상이 같은 하이브리드을했습니다 : :이 같은 Program.cs에서 콘솔과의 WinForm 모드 사이를 전환하고

[STAThread] 
public static int Main(string[] args) 
{ 
    if (args.Length > 0) 
    { 
     // run console code here 
    } 
    else 
    { 
     // start up the win form app 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 

    return 0; 
} 
2

를 대신이의 iffy 메서드를 사용하면 winforms 응용 프로그램을 만들고 명령 줄에 특정 인수가 전달 된 경우 기본 폼을 표시하지 않고이 작업을 수행 할 수 있습니다.

콘솔 응용 프로그램이 메시지 루프를 필요로하지 않으므로 콘솔 모드에서 호출 할 때 Application.Run()을 호출하지 않습니다.

static void Main(params string[] args) 
    { 
     if (args.Length > 0 && args[0] == "consolemode") 
     { 
      // do stuff 
     } 
     else 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new MainForm()); 
     } 
    } 

나는이 시도하지 않은하지만 난 그것이 작동 것이라고 생각 :

그래서 당신의 홈페이지는() 같은 것이 될 것이다.

관련 문제