2009-12-28 69 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; 
} 

如果上述方法返回false,它是一个控制台应用程序。

-Oisin

+0

如果同时打开窗体和控制台会怎么样?函数返回什么?它会在语义上是真的吗? – 2009-12-28 22:20:48

+0

@Aviad:在Windows上没有干净的方法来实现这一点。一个可执行文件只能编译一个可用的子系统,例如。子系统(控制台应用程序)或Windows GUI子系统(或本机,OS/2或Posix)的Windows特性。当然,您可以将控制台附加到窗口应用程序,但应用程序仍然是窗口应用程序。 – 2009-12-28 22:24:44

+0

这对于本机可执行文件可能是正确的,但不适用于.NET。 – 2009-12-28 22:26:11

0

如果它不需要以编程方式完成,你可以使用像ProcessExplorer这样的程序,看看是否加载了System.Winforms.dll。我不认为这是万无一失的,但它可能是一个开始。

0

一个选项可能是检查System.Windows.Forms.Application.OpenForms是否包含任何元素。

另一个选项可能是检查Console.TitleConsole.WindowTop是否引发异常(如果没有控制台窗口打开,则会发生异常)。

编辑

但是,请注意,一个应用程序可以有一个控制台窗口形式在同一时间开...什么样的应用是它呢?

5

您无法可靠地做到这一点。例如,从Windows窗体应用程序项目模板启动一个新项目。项目+属性,将输出类型更改为“控制台应用程序”。按F5查看看起来像什么。虽然每个合理的测试都会说它是一个控制台模式应用程序,但它非常适合WF应用程序。

正好相反,只是System.Windows.Forms.dll的存在并未使其成为WF应用程序。例如,控制台应用程序可能会使用它来显示MessageBox。

此外,它可能不是。您的代码可能会被服务调用。

解决这个问题,应用程序的作者永远不会有问题告诉你你的代码应该做什么。添加一个属性到你的班级,让她这样做。

+0

+1这比其他upvoted的答案准确得多。 – 2009-12-28 22:24:28

相关问题