Cacher la console dans une application console [Résolu]

Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 12 août 2008 à 20:23 - Dernière réponse : florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention
- 13 août 2008 à 17:19
Bonsoir,
je voudrais savoir comment cacher la fenêtre noire console, selon un paramètre d'execution.
Exemple pour un programme quelconque, si on l'execute avec un paramètre -debug (soit "MonExe.exe -debug")
la fenêtre console apparaît au lancement. (On vérifie dans les ParamStr au démarrage de l'appli).
Mais en revanche elle ne s'affiche pas si on ne trouve pas -debug dans les ParamStr

if ParamStr(1) = '-debug' then {Afficher console} else {Ne pas l'afficher}

Avec {$AppType Console} dans fichier app. elle apparaît peu importe ce qu'il se passe ... existe-t-il une routine pour la cacher ?

Merci de votre aide :) je n'ai rien trouvé sur CS ni sur Google répondant à ma question ...

Cordialement, Bacterius !
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 12 août 2008 à 21:55
3
Merci
Salut Bacterius

<style type="text/css"><!-- body { color: #000000; background-color: #FFFFFF; } .pas1-assembler { background-color: #FFFFFF; color: #000000; } .pas1-character { background-color: #FFFFFF; color: #008080; } .pas1-comment { background-color: #FFFFFF; color: #000080; font-style: italic; } .pas1-float { background-color: #FFFFFF; color: #FF0000; } .pas1-hexadecimal { background-color: #FFFFFF; color: #FF0000; } .pas1-identifier { background-color: #FFFFFF; color: #000000; } .pas1-number { background-color: #FFFFFF; color: #FF0000; } .pas1-preprocessor { background-color: #FFFFFF; color: #000080; font-style: italic; } .pas1-reservedword { background-color: #FFFFFF; color: #000000; font-weight: bold; } .pas1-space { background-color: #FFFFFF; color: #000000; } .pas1-string { background-color: #FFFFFF; color: #008080; } .pas1-symbol { background-color: #FFFFFF; color: #000000; } --></style><!--EndFragmen-->
program HideConsole; 

{$APPTYPE CONSOLE}  

uses
  Windows, SysUtils;  

var 
  handle: hwnd;   
  i: integer; 

const 
  title = 'MonAppliConsole'; 

begin 
  SetConsoleTitle(title);   
  handle := FindWindow(nil, title);   
  if FindCmdLineSwitch('debug', ['-','/'], true) then
    ShowWindow(handle, SW_SHOW)
  else
    ShowWindow(handle, SW_HIDE);
  //just for tests 
  for i := 0 to 10000 do 
    WriteLn(i:5);
end. 


La recherche du handle de la fenêtre de la console est un peu "brute"...mais ce n'est pas le problème qui te préoccupe.

Bonne continuation.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Meilleure réponse
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 13 août 2008 à 13:22
3
Merci
Salut,

Dans ton cas, je ferai autrement: j'enlèverai {$APPTYPE CONSOLE} comme ça par défaut l'application s'exécute sans console.
Et si tu as ton "-debug" alors tu crées toi même ta console.
L'avantage, c'est que tu n'auras pas de console pendant 1 sec.
L'inconvénient c'est que tu devras utiliser les fonctions Windows au lieu des fonctions pascal pour lire et écrire dans la console.

Je t'ai trouvé un bout de code en VB (voir le post de drasche) ici :http://forum.hardware.fr/hfr/Programmation/VB-VBA-VBS/vb-argument-programme-sujet_29820_1.htm
C'est largement adaptable en Delphi.

A+
Flo

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de florenth
Meilleure réponse
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 13 août 2008 à 17:19
3
Merci
Tant mieux si ça marche. Je n'avais pas Delphi sous la main pour tester.
Par contre, y'a encore plus simple car toutes les fonctions sont déjà définies dans Windows.pas (d'ailleurs, je ne comprends pas pourquoi en VB il n'y a pas de headers) et que donc il suffit de faire :

program Project;

uses
  Windows,
  SysUtils;

begin
  AllocConsole;
  SetConsoleTitle('Debug');
  Writeln('Test');
  Readln;
  FreeConsole;
end.

En fait, on a cherché bien compliqué pour pas grand chose....
Mais comme tu le dis si bien, l'essentiel c'est que ça marche !

A+
Flohttp://www.mx-dev.net

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de florenth
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 12 août 2008 à 22:39
0
Merci
Ah merci beaucoup DelphiProg  "FindCmdLineSwitch" je ne connaissais pas, mais c'est la première fois que je touche véritablement à une appli console, et l'idée que je me faisais pour retrouver un paramètre c'était de scanner ParamStr, mais cette routine à l'air plus simple et rapide !
Grâce à toi je vais encore progresser .
Merci !

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 13 août 2008 à 10:35
0
Merci
Bonjour,
je viens de tester DelphiProg, mais la console apparaît un certain temps avant de disparaître, environ 1 seconde, mais je voudrais qu'elle n'apparaisse pas du tout ... est-ce possible ?

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 13 août 2008 à 13:39
0
Merci
Hmm oui ça m'a l'air transparent.
Je vais transcrire ça en Delphi et je vais voir ce que ça donne.
Merci Florenth.

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 13 août 2008 à 14:08
0
Merci
Bon voilà florenth, le code que j'ai réussi à transcrire (enfin ce dont j'avais besoin).


En fait j'ai besoin de :


- créer la console


- pouvoir écrire dedans à tout moment


- et la fermer


 


donc voila : (je coupe le header de l'unité, inutile)

var
  Form1: TForm1;
  hConsoleIn: HWND;
  hConsoleOut: HWND;
  hConsoleErr: HWND;


implementation


{$R *.dfm}


function AllocConsole: HWND; stdcall; external 'kernel32.dll';
function FreeConsole: HWND; stdcall; external 'kernel32.dll';
function GetStdHandle(nStdHandle: HWND): HWND; stdcall; external 'kernel32.dll';
function SetConsoleTitle(const lpConsoleTitle: String): HWND; stdcall; external 'kernel32.dll' name 'SetConsoleTitleA';
function WriteConsole(var hConsoleOutput: HWND; lpBuffer: Variant; nNumberOfCharsToWrite: LongWord; lpNumberOfCharsWritten: LongWord; lpReserved: Variant): LongWord stdcall; external 'kernel32.dll' name 'WriteConsoleA';




procedure TForm1.CreateConsole;
begin
    AllocConsole;
    SetConsoleTitle('Console');


    hConsoleIn := GetStdHandle(STD_INPUT_HANDLE);
    hConsoleOut := GetStdHandle(STD_OUTPUT_HANDLE);
    hConsoleErr := GetStdHandle(STD_ERROR_HANDLE);
End;


procedure TForm1.WriteInConsole(AText: String);
begin
     WriteConsole(hConsoleOut, AText, Length(AText), 0, 0);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
        CreateConsole;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
        FreeConsole;
end;


procedure TForm1.Button4Click(Sender: TObject);
Var
        S: String;
begin
        S := Edit1.Text;
        SetConsoleTitle(S);
end;


procedure TForm1.Button3Click(Sender: TObject);
Var
        S: String;
begin
        S := Edit1.Text;
        WriteInConsole(S);
end;


end.

(Ma fiche se compose de 4 boutons, et 1 edit (c'était pour le test))

Button1 c'est pour créer la console
Button2 c'est pour la détruire
Button3 c'est pour écrire dedans
Button4 c'est pour fixer un titre
Edit1 sert pour fixer le titre ou écrire dedans

Tout fonctionne parfaitement, aucune erreur, sauf que rien ne s'écrit dans la console quand j'appelle WriteConsole (par WriteInConsole) ... je dois mal avoir transcrit la fonction :x

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 13 août 2008 à 16:16
0
Merci
Ah c'est bon, j'allais quitter l'ordinateur quand je me dis "et puis après tout pourquoi ne pas tenter un WriteLn('Test') et -_-' ca a écrit dans la console. J'avais attendu vos réponses pendant 1 heure alors qu'il suffisait d'un WriteLn !
Enfin l'essentiel c'est que ça marche :)
Merci quand même à toi DelphiProg d'avoir tenté de répondre à ma question, et à toi Florenth pour m'avoir aiguillé sur un site qui contenait les routines API, il me suffisait juste de transcrire (c'était pas facile ><).
Merci.

Cordialement, Bacterius !
Commenter la réponse de Bacterius

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.