Page 1 sur 1

Console MSDos colorée

Publié : lun. 02/mai/2005 20:50
par novicenpure
Salut les amis Purebasiciens,

Dans le cadre de mon travail, j'utilise pas mal la console msdos pour
lancer certains programmes de calcul. Je trouve que la console standard
(programme "cmd.exe") est un peu terne et peu lisible lorsque très remplie. De plus, j'évite les fichiers "batch" car j'aime contrôler l'évolution
de mes résultats en temps réels. Enfin bref, quelqu'un connaît-il ou a-t-il déjà programmé une petite console windows avec des couleurs différentes pour les commandes/réponses, genre :

invite> dir (en rouge)
C:\monfichier1 (en vert)
C:\monfichier2 (en vert)
invite> (en rouge)

etc....

Sinon, si je dois programmer moi-même, avez-vous une idée sur comment démarrer le source :cry: ? Merci à vous.

Publié : lun. 02/mai/2005 21:14
par Droopy
Si tu veut le faire par toi même il y a SetConsoleTextAttribute ( API Win32 ) qui devrait faire l'affaire


Ou sinon si tu veux qqchose de tout prêt

http://www.purearea.net/pb/download/use ... nsoleX.zip

Publié : lun. 02/mai/2005 21:46
par novicenpure
Merci pour la librairie. Encore un question : puis-je utiliser le programme "cmd.exe" ou je suis obligé de reprogrammer toutes les commandes MSDos (genre "dir" avec ExamineDirectory()....etc). (ce qui risque d'être très long :cry: )

Si je peux utiliser cmd, comment lui dire de changer les couleurs ?....

Publié : lun. 02/mai/2005 22:58
par Droopy
Effectivement avec la lib ça va être coton

Le mieux semble l'Api même si c'est aussi coton à programmer

sinon ( de mémoire ) il y avait il y a longtemps un fichier ansi.sys que l'on mettait dans le config.sys, et qui permettait de changer la couleur dans une console via des code Esc ?? à voir ...

Publié : mar. 03/mai/2005 0:20
par Guimauve
Exemple qui provient de l'aide dans la rubrique Console :

Code : Tout sélectionner

If OpenConsole()
  For foreground=0 To 15
    For background=0 To 15
      ConsoleColor(foreground, background)
      Print(Right(Hex(background), 1))
    Next
    
    PrintN("")
  Next
  
  ConsoleColor(7, 0)
  PrintN("Appuyer sur 'Return' pour quitter")
  Input()
  CloseConsole()
EndIf
End
Je pense que si tu mets foreground à la couleur désiré et le background en noir, ça va faire ce que tu veux.

A+
Guimauve

Publié : mar. 03/mai/2005 6:17
par comtois
peut-être par le biais des macros ?

http://www.trucsastuces.com/Forums/topic-5162.html


si tu tapes help ,tu verras color , mais ça ne change que le premier plan et l'arrière plan .

Publié : mar. 03/mai/2005 7:32
par novicenpure
merci merci les amis. apparemment, ansi.sys n'est plus utilisé par windows.. :cry: ... je peux peut être m'arranger
pour récupérer les entrées sorties de cmd.exe en bidouillant avec des fichiers batch. Je m'explique : je rentre une commande dans mon EditorGadget() et PB écrit un fichier de commande msdos (fichier.bat), l'execute, et stocke la sortie dans un fichier resultat.txt, exemple :

fichier.bat :
dir > cmd > resultat.txt

resultat.txt :
C:\monfichier1.jpg
C:\monfichier2.bmp
etc....

et ensuite PB va lire le fichier resultat.txt pour ensuite me le réécrire dans l'EditorGadget()..... ça fait pas terrible comme programmation ....
les pros de PB vont se moquer de moi :D

Publié : mar. 03/mai/2005 13:47
par Droopy
Laisse tomber la console PureBasic, car elle n'intègre pas de barre de défilement, ce qui est peu pratique si tu veux voir ce qui s'est passé avant / si une commande renvoie plus d'infos que l'écran !

Test ce code :

Code : Tout sélectionner

; Redirect Outputs into Memory (redirected the pipes)
; coded by Siegfried Rings march 2002 
; Tweaked by Droopy ( 03/05/05 )

;see http://support.microsoft.com/default.aspx?scid=kb;EN-US;q173085 

;Structure used by the CreateProcessA function 
;another then that Fred implemented ! 

Structure MySTARTUPINFO 
  cb.l 
  lpReserved.l 
  lpDesktop.l 
  lpTitle.l 
  dwX.l 
  dwY.l 
  dwXSize.l 
  dwYSize.l 
  dwXCountChars.l 
  dwYCountChars.l 
  dwFillAttribute.l 
  dwFlags.l 
  wShowWindow.w 
  cbReserved2.w 
  lpReserved2.l 
  hStdInput.l 
  hStdOutput.l 
  hStdError.l 
EndStructure 

Procedure.s ConformationAsciiEtenduVersAscii(Text.s)
  ReplaceString(Text,Chr(130),"é",2)
  ReplaceString(Text,Chr(135),"ç",2)
  ReplaceString(Text,Chr(131),"â",2)
  ReplaceString(Text,Chr(133),"à",2)
  ReplaceString(Text,Chr(136),"ê",2)
  ReplaceString(Text,Chr(137),"ë",2)
  ReplaceString(Text,Chr(138),"è",2)
  ReplaceString(Text,Chr(140),"î",2)
  ReplaceString(Text,Chr(150),"û",2)
  ReplaceString(Text,Chr(151),"ù",2)
  ReplaceString(Text,Chr(240),"-",2)
  ReplaceString(Text,Chr(242),"=",2)
  ReplaceString(Text,Chr(255)," ",2)
  
  ; Nettoie des caractères < 31
  For n=1 To 31
    If n=9 : Continue : EndIf
    If n=10 : Continue : EndIf ; LF fout la zone je le supprime
    ; If n=13 : Continue : EndIf 
    ReplaceString(Text,Chr(n),"",2)
  Next
  
  ProcedureReturn Text
EndProcedure

Procedure.s GetProgramResult(Command.s)
  
  proc.PROCESS_INFORMATION ;Process info filled by CreateProcessA 
  ret.l ;long variable For get the Return value of the 
  start.MySTARTUPINFO ;StartUp Info passed To the CreateProceeeA 
  sa.SECURITY_ATTRIBUTES ;Security Attributes passeed To the 
  hReadPipe.l ;Read Pipe handle created by CreatePipe 
  hWritePipe.l ;Write Pite handle created by CreatePipe 
  lngBytesread.l ;Amount of byte Read from the Read Pipe handle 
  strBuff.s=Space(256) ;String buffer reading the Pipe 
  
  ;Consts For functions 
  #NORMAL_PRIORITY_CLASS = $20 
  #STARTF_USESTDHANDLES = $100 
  #STARTF_USESHOWWINDOW = $1 
  
  ;Create the Pipe 
  sa\nLength =SizeOf(SECURITY_ATTRIBUTES) ;Len(sa) 
  sa\bInheritHandle = 1 
  sa\lpSecurityDescriptor = 0 
  ret = CreatePipe_(@hReadPipe, @hWritePipe, @sa, 0) 
  If ret = 0 
    ;If an error occur during the Pipe creation exit 
    MessageRequester("info", "CreatePipe failed. Error: ",0) 
    End 
  EndIf 
  
  
  start\cb = SizeOf(MySTARTUPINFO) 
  start\dwFlags = #STARTF_USESHOWWINDOW | #STARTF_USESTDHANDLES 
  
  ;set the StdOutput And the StdError output To the same Write Pipe handle 
  start\hStdOutput = hWritePipe 
  start\hStdError = hWritePipe 
  
  ;Execute the command 
  ret = CreateProcess_(0, Command, sa, sa, 1, #NORMAL_PRIORITY_CLASS, 0, 0, @start, @proc) 
  
  If ret <> 1 
    retour.s=""
  Else
    
    ;Now We can ... must close the hWritePipe 
    ret = CloseHandle_(hWritePipe) 
    
    mOutputs.s = "" 
    
    ;Read the ReadPipe handle 
    While ret<>0 
      ret = ReadFile_(hReadPipe, strBuff, 255, @lngBytesread, 0) 
      If lngBytesread>0 
        mOutputs = mOutputs + Left(strBuff, lngBytesread) 
      EndIf 
    Wend 
    
    ;Close the opened handles 
    ret = CloseHandle_(proc\hProcess) 
    ret = CloseHandle_(proc\hThread) 
    ret = CloseHandle_(hReadPipe) 
    ;ret=CloseHandle_(hWritePipe) 
    
    retour.s=mOutputs
    
  EndIf
  
  ProcedureReturn ConformationAsciiEtenduVersAscii(mOutputs)
EndProcedure

Commande.s="Cmd /c dir c:\"
MessageRequester(Commande,GetProgramResult(Commande))
Commande.s="net start"
MessageRequester(Commande,GetProgramResult(Commande))
Commande.s="ping localhost"
MessageRequester(Commande,GetProgramResult(Commande))
Le code est de Siegfried, je l'ai modifié quelque peu, je pense intégrer cette fonction dans la prochaine version de ma lib.

Publié : mar. 03/mai/2005 17:20
par novicenpure
Une pure merveille !! Pile ce que je cherchais. Mille mercis. Une petite interface avec un EditorGadget ou un OpenConsole et quelques couleurs, et le tour est joué.

Encore une fois merci. A +