2009-12-28 3 views

ответ

4

P/Invoke:

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

Struct:

[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; 
} 

Если вышеописанный метод возвращает ложь, это консольное приложение.

-Oisin

+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 исключение (если бы ни одно консольное окно не было открыто).

EDIT

Однако, обратите внимание, что приложение может иметь окно консоли и форму открытой в то же время ... Какие приложения это тогда?

5

Вы не можете сделать это надежно. Например, запустите новый проект из шаблона проекта приложения Windows Forms. Project + Properties, измените тип вывода на «Консольное приложение». Нажмите F5, чтобы посмотреть, как это выглядит. Хотя каждый разумный тест скажет, что это приложение в режиме консоли, оно очень похоже на приложение WF.

Противоположное также верно, просто наличие System.Windows.Forms.dll не делает его WF-приложением. Консольное приложение может использовать его для отображения MessageBox, например.

Кроме того, это не может быть ни. Ваш код может быть вызван службой.

Punt this problem, автор приложения никогда не сталкивался с проблемой, говоря вам, что должен делать ваш код. Добавьте свойство в свой класс, чтобы позволить ей сделать это.

+0

+1 это намного точнее, чем другой ответ. –

Смежные вопросы