2009-12-28 6 views

Répondre

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; 
} 

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

+0

Que faire si un formulaire et une console sont ouverts en même temps? Que retournerait la fonction? Et serait-ce sémantiquement vrai? –

+0

@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. –

+0

Cela peut être vrai pour un exécutable natif, mais pas pour un fichier .NET. –

0

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.

0

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?

5

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.

+0

+1 ce qui est beaucoup plus précis que l'autre réponse upvoted. –

Questions connexes