如何確定正在運行的應用程序是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. 決定設備類型的應用程序正在運行
- 2. 如何確定運行應用程序的Application Server的類型?
- 3. 如何確定哪些正在運行的應用程序使用.Net
- 4. 確定運行.NET應用程序的系統要求
- 5. 是否可以確定運行時正在調用的.net組件的類型?
- 6. 在.NET中監視正在運行的應用程序?
- 7. Guice - 如何綁定程序運行時確定的類型?
- 8. 如何確定應用程序是否正在運行?
- 9. 安裝.pkg:確定正在更新的應用程序是否正在運行?
- 10. .Net應用程序正常運行時,打破預定時間
- 11. 從.NET 3.5應用程序運行.NET 4.0應用程序
- 12. ThreadPoolExecutor正在運行的應用程序
- 13. 正在運行的facebook應用程序
- 14. 在VPS上運行.net應用程序
- 15. 在Azure上運行.NET應用程序
- 16. Windows.Forms:激活已經在正確運行的應用程序FormWindowState
- 17. Spring MVC應用程序在「不正確的」URL上運行
- 18. .NET MVC4 - 在父應用程序中運行應用程序
- 19. 如何確定正在運行的Haskell腳本或應用程序的目錄?
- 20. Emacs - 測試確定什麼類型的鉤子正在運行
- 21. 我的應用程序如何在運行時確定它運行的.NET框架的版本?
- 22. 強制應用程序在特定的.NET運行時版本下運行?
- 23. 如何告訴應用程序在特定的.net運行時上運行
- 24. 在非通用類在運行時確定泛型類型
- 25. 如何使用KeyEvent定位正在運行的應用程序?
- 26. JTabbedPane的當我運行我的應用程序不能正確
- 27. 如何確定在Visual Studio vshost下運行的應用程序?
- 28. 我可以在.NET 2應用程序中運行.NET 4應用程序嗎?
- 29. 將文件類型關聯到正在運行的應用程序
- 30. 如何確定應用程序正在運行的屏幕/監視器?
如果同時打開窗體和控制檯會怎麼樣?函數返回什麼?它會在語義上是真的嗎? – 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