web-dev-qa-db-fra.com

Rendre mon application console invisible

Je développe une application console pour ma bibliothèque publique en tant que projet d'école. L'application console s'exécutera dès que l'utilisateur se connectera et effectuera un travail en arrière-plan.

Le fait est que je ne veux pas que l'application console apparaisse réellement. J'ai besoin de ça invisible. La dernière chose dont j'ai besoin, ce sont les plaintes, car certaines personnes ont eu peur du fait qu'une fenêtre CMD s'ouvrait et se fermait, outre le fait que la bibliothèque le souhaite aussi invisible que possible.

J'ai essayé de suivre le code de ce fil: http://social.msdn.Microsoft.com/Forums/en-US/csharpgeneral/thread/ea8b0fd5-a660-46f9-9dcb-d525cc22dcbd

mais en vain, je peux toujours voir l’application de la console s’ouvrir et se fermer une fois qu’elle a effectué tout son travail.

Existe-t-il un meilleur moyen d'empêcher la console d'apparaître? Merci.

19
Kratz

La meilleure chose à faire est de ne pas le compiler en tant qu'application console! Compilez-le en tant que fichier EXE Windows et aucune console ne s'affichera. Ensuite, vous pouvez simplement faire ce que vous devez faire dans la méthode Main sans afficher d'interface utilisateur.

Mais dans tous les cas, si vous devez masquer/afficher la fenêtre de la console, je n’utiliserai pas FindWindow pour cette tâche car il existe une API beaucoup plus fiable pour cela: GetConsoleWindow . Cela vous donnera le HWND de la fenêtre de la console et vous pouvez essayer de le transmettre à ShowWindow.

37
Josh

Comme Josh Einstein a suggéré que vous pouvez utiliser ShowWindow Api pour masquer votre fenêtre.

Voici un exemple:

using System.Runtime.InteropServices

class CommandLine
{

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("Kernel32")]
    private static extern IntPtr GetConsoleWindow();

    const int SW_HIDE=0;
    const int SW_SHOW=5;

    static void Main(string[] args)
    {
         IntPtr hwnd;
         hwnd=GetConsoleWindow();
         ShowWindow(hwnd,SW_HIDE);

         //Your logic goes here
    }
}

Je ne suis pas sûr de ce code car je ne l'ai pas testé. Faites-moi savoir si vous rencontrez un problème.

16
Searock

Avez-vous essayé: Propriétés du projet> Application> Type de sortie: vers "Application Windows"?

9
NinjaCat

Bonjour, je créais une application console à appeler par le planificateur de tâches. Je ne voulais pas que l'application de la console apparaisse, j'ai donc modifié les propriétés du projet pour que la sortie apparaisse dans l'application Windows.

Changez le type de sortie en application Windows Allez dans: Projet -> Propriétés du projet et changez le type de sortie en Application Windows

2
Nico Leguizamon

C'est un peu plus compliqué qu'une application en console ... mais si vous voulez que quelque chose soit vraiment exécuté en arrière-plan lorsque quelqu'un se connecte, vous pouvez créer une application de service Windows.

Toutefois, la configuration et l’installation du service Windows nécessitent un peu de travail supplémentaire, mais il existe de nombreux exemples de code sur le Web:

http://msdn.Microsoft.com/en-us/library/9k985bc9(v=VS.80).aspx

http://msdn.Microsoft.com/en-us/library/sd8zc8ha(v=VS.80).aspx

http://www.c-sharpcorner.com/uploadfile/mahesh/window_service11262005045007am/window_service.aspx

http://www.developer.com/net/net/article.php/2173801/Creating-a-Windows-Service-in-NET.htm

http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

2
Lewray

J'ai essayé les deux méthodes 2) Searock et ensuite 1) Josh --- avec la solution de Searock, la fenêtre de l'application de la console est toujours apparue, bien que, pendant un très bref instant ---, avec la solution de Josh, la console n'est pas apparue et mon programme n'a eu aucun problème - bien sûr, j'ai dû remplacer tous les appels console.writeline par un appel qui a consigné les informations dans un fichier journal

Note: j'aurais juste commenté la solution de Josh mais je ne peux pas le faire pour l'instant :)

0
Dennis Jensen