如何确定正在运行的应用程序是Windows Forms还是控制台应用程序?
p/invoke:
[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;
}
如果不需要以编程方式完成,您可以尝试使用类似ProcessExplorer的程序,并查看System.Winforms.dll是否已加载。我认为这并不是绝对可靠的方法,但这可能是一个好的开始。
一种选择可能是检查System.Windows.Forms.Application.OpenForms
是否包含任何元素。
另一种选择可能是检查Console.Title
或Console.WindowTop
是否会抛出异常(如果没有控制台窗口打开,则会抛出异常)。
编辑
但请注意,一个应用程序可能同时拥有控制台窗口和表单...那么它是什么类型的应用程序呢?
dumpbin/HEADERS myapp.exe
将显示PE标题。查找显示子系统的行。值为2表示Windows GUI,值为3表示Windows CUI(控制台应用程序)(请参见http://msdn.microsoft.com/en-us/magazine/ms809762.aspx)。 - Dirk Vollmar