2009-12-28 4 views

답변

4

P/호출 :

[DllImport("shell32.dll")] 
private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); 

구조체 :

[StructLayout(LayoutKind.Sequential)] 
private struct SHFILEINFO 
{ 
    public IntPtr hIcon; 
    public IntPtr iIcon; 
    public uint dwAttributes; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)] 
    public string szDisplayName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=80)] 
    public string szTypeName; 
} 

방법 :

private static bool IsWindowsApplication(string fileName) 
{ 
    SHFILEINFO psfi = new SHFILEINFO(); 
    switch (((int) SHGetFileInfo(fileName, 0, ref psfi, (uint) Marshal.SizeOf(psfi), 0x2000))) 
    { 
     case 0: 
      return false; 

     case 0x4550: 
      return false; 

     case 0x5a4d: 
      return false; 
    } 
    return true; 
} 

위의 메소드가 false를 돌려주는 경우,이 콘솔 응용 프로그램입니다.

- 오진

+0

양식과 콘솔이 동시에 열리는 경우 어떻게해야합니까? 함수는 무엇을 반환할까요? 그리고 그것은 의미 론적으로 사실일까요? –

+0

@Aviad : Windows에서이 작업을 수행 할 수있는 명확한 방법은 없습니다. 실행 파일은 사용 가능한 하위 시스템 중 하나에 대해서만 컴파일 될 수 있습니다. 서브 시스템의 Windows 문자 (콘솔 응용 프로그램) 또는 Windows GUI 서브 시스템 (또는 원시, OS/2 또는 Posix). 물론 창 응용 프로그램에 콘솔을 연결할 수는 있지만 응용 프로그램은 여전히 ​​창 응용 프로그램으로 남아 있습니다. –

+0

네이티브 실행 파일에는 해당되지만 .NET 실행 파일에는 해당되지 않을 수 있습니다. –

0

프로그래밍 방식으로 수행 할 필요가없는 경우 ProcessExplorer 같은 프로그램을 사용하여 System.Winforms.dll이로드되었는지 확인할 수 있습니다. 나는 이것이 완벽하다고 생각하지 않지만 시작일 수 있습니다.

0

System.Windows.Forms.Application.OpenForms에 요소가 포함되어 있는지 확인하는 옵션이 있습니다.

또 다른 옵션은 Console.Title 또는 Console.WindowTop이 예외를 throw하는지 (콘솔 창이 열려 있지 않은 경우) 확인하는 것입니다.

편집

그러나 응용 프로그램이 콘솔 창 형태로 동시에 열 ... 그 다음 응용 프로그램의 어떤 종류가있을 수 있습니다?

5

신뢰할 수없는 방법입니다. 예를 들어 Windows Forms 응용 프로그램 프로젝트 템플릿에서 새 프로젝트를 시작합니다. 프로젝트 + 속성, 출력 유형을 "콘솔 응용 프로그램"으로 변경하십시오. F5 키를 눌러 모양을 확인합니다. 모든 합리적인 테스트가 콘솔 모드 응용 프로그램이라고 말하지만, 이는 대단히 WF 응용 프로그램입니다.

반대의 경우도 마찬가지입니다. System.Windows.Forms.dll이 있으면 WF 앱이되지 않습니다. 콘솔 응용 프로그램은이를 사용하여 예를 들어 MessageBox를 표시 할 수 있습니다.

더욱 그렇습니다. 코드는 서비스에 의해 호출 될 수 있습니다.

이 문제를 근절하면 앱 작성자는 코드에서 수행해야 할 문제를 알리지 않습니다. 클래스에 속성을 추가하면 클래스에 속성을 추가 할 수 있습니다.

+0

+1 이것은 다른 upvoted 대답보다 훨씬 정확합니다. –

관련 문제