2009-12-28 40 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

相關問題