如何确定正在运行的应用程序是Windows窗体还是控制台应用程序?确定正在运行的应用程序的类型(.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;
}
如果上述方法返回false,它是一个控制台应用程序。
-Oisin
如果它不需要以编程方式完成,你可以使用像ProcessExplorer这样的程序,看看是否加载了System.Winforms.dll。我不认为这是万无一失的,但它可能是一个开始。
一个选项可能是检查System.Windows.Forms.Application.OpenForms
是否包含任何元素。
另一个选项可能是检查Console.Title
或Console.WindowTop
是否引发异常(如果没有控制台窗口打开,则会发生异常)。
编辑
但是,请注意,一个应用程序可以有一个控制台窗口和形式在同一时间开...什么样的应用是它呢?
您无法可靠地做到这一点。例如,从Windows窗体应用程序项目模板启动一个新项目。项目+属性,将输出类型更改为“控制台应用程序”。按F5查看看起来像什么。虽然每个合理的测试都会说它是一个控制台模式应用程序,但它非常适合WF应用程序。
正好相反,只是System.Windows.Forms.dll的存在并未使其成为WF应用程序。例如,控制台应用程序可能会使用它来显示MessageBox。
此外,它可能不是。您的代码可能会被服务调用。
解决这个问题,应用程序的作者永远不会有问题告诉你你的代码应该做什么。添加一个属性到你的班级,让她这样做。
+1这比其他upvoted的答案准确得多。 – 2009-12-28 22:24:28
- 1. 如何确定运行应用程序的Application Server的类型?
- 2. 如何确定哪些正在运行的应用程序使用.Net
- 3. 是否可以确定运行时正在调用的.net组件的类型?
- 4. 确定运行.NET应用程序的系统要求
- 5. 在.NET中监视正在运行的应用程序?
- 6. .Net应用程序正常运行时,打破预定时间
- 7. ThreadPoolExecutor正在运行的应用程序
- 8. 正在运行的facebook应用程序
- 9. 从.NET 3.5应用程序运行.NET 4.0应用程序
- 10. 在Azure上运行.NET应用程序
- 11. Spring MVC应用程序在“不正确的”URL上运行
- 12. Windows.Forms:激活已经在正确运行的应用程序FormWindowState
- 13. 如何确定正在运行的Haskell脚本或应用程序的目录?
- 14. .NET MVC4 - 在父应用程序中运行应用程序
- 15. 在非通用类在运行时确定泛型类型
- 16. 强制应用程序在特定的.NET运行时版本下运行?
- 17. 如何告诉应用程序在特定的.net运行时上运行
- 18. 如何使用KeyEvent定位正在运行的应用程序?
- 19. JTabbedPane的当我运行我的应用程序不能正确
- 20. 将文件类型关联到正在运行的应用程序
- 21. 如何确定哪个JVM连接到正在运行的应用程序?
- 22. 运行时间确定C的类型
- 23. 在Python中确定正在运行的程序
- 24. 在运行时确定一个通用类的类型
- 25. 应用程序窗口中的光标不正确类型
- 26. 确定从应用程序中运行的存储过程
- 27. iOS 8 - 如何确定前台应用程序以及获取正在运行的应用程序列表
- 28. 如何确定我是否正在运行侧装应用程序或商店安装的应用程序?
- 29. 确定应用程序是否在远程系统上运行
- 30. 如何确定线程java应用程序运行时的主类?
如果同时打开窗体和控制台会怎么样?函数返回什么?它会在语义上是真的吗? – 2009-12-28 22:20:48
@Aviad:在Windows上没有干净的方法来实现这一点。一个可执行文件只能编译一个可用的子系统,例如。子系统(控制台应用程序)或Windows GUI子系统(或本机,OS/2或Posix)的Windows特性。当然,您可以将控制台附加到窗口应用程序,但应用程序仍然是窗口应用程序。 – 2009-12-28 22:24:44
这对于本机可执行文件可能是正确的,但不适用于.NET。 – 2009-12-28 22:26:11