Как определить, является ли запущенное приложение Windows Forms или консольным приложением?Определение типа запущенного приложения (.NET)
ответ
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
Если это не нужно делать программно, возможно, вы можете использовать программу, например ProcessExplorer, и посмотреть, загружена ли файл System.Winforms.dll. Я не думаю, что это безопасно, но это может быть началом.
Один из вариантов может заключаться в том, чтобы проверить, содержит ли System.Windows.Forms.Application.OpenForms
любые элементы.
Другим вариантом может быть проверка того, выбрал ли Console.Title
или Console.WindowTop
исключение (если бы ни одно консольное окно не было открыто).
EDIT
Однако, обратите внимание, что приложение может иметь окно консоли и форму открытой в то же время ... Какие приложения это тогда?
Вы не можете сделать это надежно. Например, запустите новый проект из шаблона проекта приложения Windows Forms. Project + Properties, измените тип вывода на «Консольное приложение». Нажмите F5, чтобы посмотреть, как это выглядит. Хотя каждый разумный тест скажет, что это приложение в режиме консоли, оно очень похоже на приложение WF.
Противоположное также верно, просто наличие System.Windows.Forms.dll не делает его WF-приложением. Консольное приложение может использовать его для отображения MessageBox, например.
Кроме того, это не может быть ни. Ваш код может быть вызван службой.
Punt this problem, автор приложения никогда не сталкивался с проблемой, говоря вам, что должен делать ваш код. Добавьте свойство в свой класс, чтобы позволить ей сделать это.
+1 это намного точнее, чем другой ответ. –
- 1. Определение типа в .NET
- 2. Определение типа интерфейса .NET в Visual C++
- 3. запущенного приложения EJB
- 4. передать аргументы запущенного приложения
- 5. Перезапуск уже запущенного приложения
- 6. Остановка запущенного искрового приложения
- 7. Захватив снимок запущенного приложения .net для воспроизведения в отладчике позже
- 8. Уменьшите время запуска приложения .NET windows form, запущенного сетевого диска.
- 9. Возможно ли в .NET сбрасывать IL из запущенного приложения?
- 10. Отключить командное окно от запущенного приложения командной строки с .NET
- 11. Отображение диалога из приложения, запущенного службой
- 12. Определение типа анонимного типа
- 13. iPhone - Несколько экземпляров запущенного приложения?
- 14. Отправка приложения, запущенного другим разработчиком
- 15. исключение запущенного приложения спящего режима
- 16. Разрешение приложения, запущенного пользователем SYSTEM
- 17. Определение типа
- 18. Как сделать неинвазивное профилирование запущенного приложения ASP.NET?
- 19. Определение типа типа для prom.reject
- 20. Определение типа типа для prom.prototype.finally
- 21. Определение местоположения приложения приложения
- 22. Определение типа объекта
- 23. Определение типа возвращаемого типа динамического типа
- 24. Определение типа проекта вызова в библиотеке класса .net
- 25. Определение сериализованного размера .NET-типа и неуправляемой эффективности памяти
- 26. Предоставление .NET-программы выходного типа приложения Windows и консольного приложения
- 27. Определение типа вывода от общего типа
- 28. Определение типа файла для Keycloak.js
- 29. Определение типа объекта с JSON
- 30. . Определение прокси-сервера .NET
Что делать, если есть открытая форма и консоль одновременно? Что бы вернуть функцию? И это было бы семантически верно? –
@Aviad: В Windows нет чистого способа добиться этого. Исполняемый файл может быть скомпилирован только для одной из доступных подсистем, например. подсистему Windows (консольное приложение) или подсистему Windows GUI (или родной, OS/2 или Posix). Конечно, вы можете прикрепить консоль к оконному приложению, но приложение все равно останется оконным приложением. –
Это может быть правдой для обычного исполняемого файла, но не для .NET. –