Comment puis-je déterminer si l'application en cours d'exécution est une application Windows Forms ou une application de console?Détermination du type d'application en cours d'exécution (.NET)
Répondre
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;
}
Méthode:
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;
}
Si la méthode ci-dessus renvoie faux, il est une application console.
-Oisin
Si ce n'est pas nécessaire, vous pouvez utiliser un programme comme ProcessExplorer et voir si le fichier System.Winforms.dll est chargé. Je ne pense pas que ce soit infaillible, mais ce peut être un début.
Une option pourrait être de vérifier si System.Windows.Forms.Application.OpenForms
contient des éléments.
Une autre option peut être de vérifier si Console.Title
ou Console.WindowTop
lève une exception (si aucune fenêtre de console n'est ouverte).
EDIT
Cependant, notez qu'une application peut avoir une fenêtre de console et une forme ouverte en même temps ... Quel type d'application est-il alors?
Vous ne pouvez pas le faire de manière fiable. Par exemple, démarrez un nouveau projet à partir du modèle de projet Windows Forms Application. Projet + Propriétés, modifiez Type de sortie sur "Application console". Appuyez sur F5 pour voir à quoi cela ressemble. Bien que chaque test raisonnable indique qu'il s'agit d'une application en mode console, il s'agit d'une application WF.
L'inverse est également vrai, simplement la présence de System.Windows.Forms.dll ne fait pas une application WF. Une application de console peut l'utiliser pour afficher un MessageBox par exemple.
En outre, il pourrait être ni. Votre code peut être appelé par un service.
Pount ce problème, l'auteur de l'application n'a jamais un problème vous indiquant ce que votre code devrait faire. Ajoutez une propriété à votre classe pour lui permettre de le faire.
+1 ce qui est beaucoup plus précis que l'autre réponse upvoted. –
- 1. Détermination du type d'un objet en JavaScript
- 2. Détermination du type d'élément WPF
- 3. Détermination du contrôleur en cours d'utilisation pour Kohana
- 4. Détermination du type d'entrées de liste
- 5. Détermination du type mime d'un fichier
- 6. Détermination d'un type d'objet
- 7. Détermination du type de résultat dans OnException du contrôleur
- 8. Détermination des programmes en cours d'exécution en Python
- 9. Détermination de la section en cours de visualisation
- 10. Détermination du type de papier actuel pour l'imprimante par défaut
- 11. Détermination du type de fichier dans le dossier des ressources
- 12. Détermination du type de contenu de la page
- 13. Détermination du type dans le modèle de fonction
- 14. Détermination du style visuel utilisé?
- 15. Envoyer du contenu en cours de chargement .Net
- 16. Détermination du modèle d'iPhone
- 17. Détermination du type MIME d'un fichier local (type de contenu) Avec PHP
- 18. Détermination de nouveaux éléments RSS dans .Net
- 19. détermination du pays ou de la langue en utilisant l'URL
- 20. Détermination du composant flash chargé
- 21. Détermination du système CLR Directory
- 22. Cours de design .NET?
- 23. Détermination de la "charge du système"
- 24. Détermination du nom du fichier de police TTF
- 25. Détermination du fichier que vous utilisez
- 26. Détermination du nombre de combinaisons possibles
- 27. URL du script en cours en JavaScript
- 28. Algorithme de détermination du taux de change
- 29. Entrée du clavier C# en cours d'envoi
- 30. Identification du client au cours d'une .NET Remoting invocation
Que faire si un formulaire et une console sont ouverts en même temps? Que retournerait la fonction? Et serait-ce sémantiquement vrai? –
@Aviad: Il n'y a pas de moyen propre d'y parvenir sous Windows. Un exécutable peut être compilé pour un seul des sous-systèmes disponibles, par ex. le caractère Windows du sous-système (une application de console) ou le sous-système Windows GUI (ou natif, OS/2 ou Posix). Bien sûr, vous pouvez attacher une console à une application de fenêtre, mais l'application restera une application de fenêtre. –
Cela peut être vrai pour un exécutable natif, mais pas pour un fichier .NET. –