web-dev-qa-db-fra.com

Éviter "Appuyez sur n'importe quelle touche pour continuer" lors de l'exécution d'une console d'application à partir de Visual Studio

Lors de l'exécution d'une application console dans Visual Studio via "Démarrer sans débogage" (Ctrl+F5), la console reste ouverte à la fin de la course et demande à

Appuyez sur n'importe quelle touche pour continuer . . .

nécessitant ainsi d'activer la fenêtre et d'appuyer sur une touche. Parfois, ce n'est pas approprié.

Pourquoi est-ce important? Au moment même où j'écris le code de sérialisation JSON, mon flux de travail est comme suit:

  • adapter le code c #
  • lancer une application console qui écrit le fichier out.json
  • voir out.json dans le navigateur avec un visualiseur json

faites cela encore et encore, pas besoin de déboguer quoi que ce soit, il suffit de couper la sérialisation et de vérifier la sortie, c'est bien.

Il s’agit de workflows comme celui-ci, où le comportement "presse n’importe ..." est gênant car il nécessite les étapes suivantes:

  • activer la fenêtre de la console
  • appuyez sur la touche .

Pas de réponses:

  • Démarrer l'application en dehors de VS dans une console séparée n'est pas une réponse.
  • En disant, vous n'en avez pas besoin.
19
citykid

Je suis à peu près sûr que vous ne pouvez pas affecter ou changer ce comportement.

Comme vous l'avez dit, cela n'a rien à voir avec votre application, car elle ne le fait pas lorsque vous double-cliquez sur le fichier EXE. Vous ne voyez cet effet que lorsque vous exécutez l'application à partir de Visual Studio sans le débogueur attaché.

Vraisemblablement, quand vous invoquez Ctrl+F5, Visual Studio exécute votre application d’une manière particulière qui fait que la fenêtre de la console reste ouverte. Je peux penser à deux façons de le faire:

%COMSPEC% /k "C:\Path\To\YourApplication.exe"

ou

%COMSPEC% /c ""C:\Path\To\YourApplication.exe" & pause"

Dans les deux cas, le comportement de pause que vous observez est intégré à la commande utilisée pour lancer votre application et est donc externe à votre application. Ainsi, à moins que vous n'ayez accès aux sources Visual Studio, vous ne les modifierez pas. L'appel d'une fonction exit à partir de votre application n'aura aucun effet, car votre application a déjà été fermée au moment où ce message apparaît.

Bien sûr, je ne vois pas pourquoi cela compte vraiment, mis à part un problème de curiosité. Cela ne se produit pas lorsque vous démarrez l'application avec le débogueur attaché, ce que vous ferez 99% du temps lorsque vous lancerez l'application à partir de l'EDI. Et puisque vous ne livrez pas Visual Studio avec votre application, vos utilisateurs vont démarrer l'application en dehors de VS.


En réponse aux mises à jour apportées à votre question, la meilleure solution serait de modifier votre application afin qu'elle ne soit pas une application console. Ce comportement n'affecte pas les applications Windows standard. quand ils sont fermés, ils ferment pour de bon.

Si vous n'avez besoin d'aucune sortie dans la fenêtre de la console, la procédure est très simple: il suffit de changez le "Type d'application" dans les propriétés de votre projet . Une application Windows Forms fonctionnera parfaitement. Si vous n’affichez pas de fenêtre (forme de fichier), on ne sera pas automatiquement créé. C'est la différence entre les applications Windows classiques et les applications console, qui créent toujours une fenêtre de console, que vous en ayez besoin ou non.

Si vous faites devez afficher la sortie dans la fenêtre de la console, vous avez deux possibilités:

  1. Créez et utilisez un formulaire simple avec un contrôle ListBox ou ListView. Chaque ligne que vous auriez normalement générée sur la console est ajoutée en tant que nouvel élément au contrôle de liste. Cela fonctionne bien si vous n'utilisez aucune des fonctionnalités "avancées" de la console.
  2. P/Invoke et appelez la fonction AllocConsole pour créer une console utilisable par votre application Windows. Vous n'avez pas besoin d'un formulaire pour cela.
14
Cody Gray

J'ai trouvé une solution qui fonctionne si vous utilisez python (je ne pouvais rien tester d'autre). Vous devez aller à 

Outils -> Options -> Outils Python -> Débogage 

Décochez la case Wait for input when process exits normally

J'espère que vous pourrez appliquer cela en quelque sorte à votre problème.

9
siggi3

Eh bien, au moins dans Visual Studio 2010, taper

 Console.ReadKey(true);

Supprime le "Appuyez sur n'importe quelle touche pour continuer ....."

1
A J

Avez-vous essayé (c #)?

Environment.Exit(0)
0
fenix

Il y a une excellente réponse ici dans une question très liée:

https://stackoverflow.com/a/15135181/122687

Je pense que c'est mieux que la réponse acceptée car cela ne vous oblige pas à appeler AllocConsole et à configurer une redirection IO. Je ne sais pas comment il est facile et robuste de configurer la redirection IO.

0
Stefan Monov