[résolu] C#/ process cmd.exe et sequence ALT + <020>ou CTRL+T

C#/ process cmd.exe et sequence ALT + <020>ou CTRL+T [résolu] - C#/.NET managed - Programmation

Marsh Posté le 18-03-2010 à 09:56:34    

Bonjour,
 
J'ai un petit soucis que je n'arrive pas à résoudre malgré mes multiples tentatives et recherches sur le net.
 
Dans le cadre d'un traitement sur une base de donnée, je doit avertir les utilisateurs de certaines incohérences très rapidement.
Pour cela j'utilise NET SEND.
 
Mon problème et que je n'arrive pas à envoyer la commande de retour à la ligne depuis mon programme en C#.
Si en ligne de commande je tape :

Code :
  1. NET SEND spish Des erreurs sont présentes aux lignes :ALT+<020>256 Error 212ALT+<020>369 Error 212


 
J'obtiens bien mes retours à la ligne.
 
Par contre dans mon code C#, si je passe des "\\n" ou des (char)10 + (char)13 il ne me les prends pas en compte;
 
Voici le code:
 

Code :
  1. string message= "";
  2.                     try
  3.                     {
  4.                         //Creation du message
  5.                         for (int i = 0; i < dataset.Tables[0].Rows.Count; i++)
  6.                         {
  7.                             for (int j = 0; j < dataset.Tables[0].Columns.Count; j++)
  8.                             {
  9.                                 message = message +" "+ dataset.Tables[0].Rows[i][j].ToString();
  10.                             }
  11.                             message=message+"\\n\\r";
  12.                         }
  13.                         Process objProcess = new Process();
  14.                         objProcess.StartInfo.FileName = "cmd.exe";
  15.                         objProcess.StartInfo.Arguments = "/C NET SEND SPISH " +message;
  16.                         objProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
  17.                         objProcess.StartInfo.CreateNoWindow = false;
  18.                         objProcess.Start();
  19.                         objProcess.WaitForExit();
  20.                     }


 
Quelqu'un aurait-il une idée de comment envoyer les control key ALT+<020> ou CTRL+T ?
 
Merci d'avance pour vos réponses


Message édité par spish le 29-03-2010 à 07:44:00
Reply

Marsh Posté le 18-03-2010 à 09:56:34   

Reply

Marsh Posté le 20-03-2010 à 12:07:03    

Et selon toi on est sensé pouvoir mettre des retours à la ligne dans les arguments d'une ligne de commande :??:
Si j'ai bien compris ce que tu veux faire faire à net send tu dois remplacer tes \n \r par un ^T (ou qqch du genre, voir la doc de Net send).
Essaie déjà en mode console avant de le faire par programmation [:spamafote].


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 22-03-2010 à 11:16:50    

Salut TotalRecall,
 
En mode console ça fonctionne très bien.
 
Voici une capture d'écran
http://img5.hostingpics.net/thumbs/mini_7913602010_03_22_111153.png
 
Mon problème c'est que je n'arrive pas à reproduire ce comportement en C#.
 
Voilà.
 
Si tu as une solution je suis preneur :)

Reply

Marsh Posté le 22-03-2010 à 12:05:56    

Ba ca fait quoi :??:


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 22-03-2010 à 13:26:03    

Des retours à la ligne :)
En C# je n'arrive pas à le programmer.
 
lorsque je fais mon dev, si tu veux ça m'affiche :
 

Code :
  1. Ligne 1 Ligne 2 Ligne 3


au lieu de  

Code :
  1. Ligne 1
  2. Ligne 2
  3. Ligne 3

(comme sur la capture d'écran)

Reply

Marsh Posté le 23-03-2010 à 11:12:14    

Et concrètement quand ça marche pas les retours à la ligne, ça ressemble à quoi ?

Reply

Marsh Posté le 24-03-2010 à 09:57:37    

Salut Kenelm,
 
Si ça ne fonctionne pas tout est aligné du genre :
 

Code :
  1. Ligne 1 Ligne 2 Ligne3.....


 
Donc illisible vu le type d'information affiché

Reply

Marsh Posté le 24-03-2010 à 10:25:02    

En mode console ça marche et en C# via process ça ne marche plus pour rigoureusement la même chaîne ?
Ca serait bien que tu te décides à partager un peu de code plutôt que donner des bribes d'infos à chaque post [:spamafote]


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 24-03-2010 à 10:28:22    

:??:  :??:  :??:  
Le code tu l'as dans le premier post....
 

Code :
  1. 1. string message= "";
  2.    2.                     try
  3.    3.                     {
  4.    4.                         //Creation du message
  5.    5.                         for (int i = 0; i < dataset.Tables[0].Rows.Count; i++)
  6.    6.                         {
  7.    7.                             for (int j = 0; j < dataset.Tables[0].Columns.Count; j++)
  8.    8.                             {
  9.    9.                                 message = message +" "+ dataset.Tables[0].Rows[i][j].ToString();
  10.   10.                             }
  11.   11.                             message=message+"\\n\\r";
  12.   12.                         }
  13.   13.
  14.   14.                         Process objProcess = new Process();
  15.   15.                         objProcess.StartInfo.FileName = "cmd.exe";
  16.   16.                         objProcess.StartInfo.Arguments = "/C NET SEND SPISH " +message;
  17.   17.                         objProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
  18.   18.                         objProcess.StartInfo.CreateNoWindow = false;
  19.   19.                         objProcess.Start();
  20.   20.                         objProcess.WaitForExit();
  21.   21.
  22.   22.                     }


 
Ce qui ne fonctionne pas, c'est ce que j'ai mis en Gras et en rouge :)
 

Reply

Marsh Posté le 24-03-2010 à 10:40:29    

Euh là je me demande si toi tu as lu mon post où je te donne une réponse possible... Pas étonnant que j'ai l'impression qu'on tourne en rond depuis le premier post :sarcastic:.


Message édité par TotalRecall le 24-03-2010 à 10:42:04

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 24-03-2010 à 10:40:29   

Reply

Marsh Posté le 24-03-2010 à 10:51:09    

Non j'ai bien vu, remplacer mes \n par ^T
Sauf que si je fais ça, le programme l'interprète comme des caractère simples et ça me donne :

Code :
  1. Ligne 1^TLigne 2^TLigne3


 
Je crois que je vais balancer mon pc par la fenêtre :)
 
 

Reply

Marsh Posté le 24-03-2010 à 12:32:15    

C'est bien ^T (ctrl T) qu'il faut faire, tu as vérifié ? J'avais précisé de contrôler dans la doc juste au cas où.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 24-03-2010 à 14:29:30    

oui c'est bien CTRL T (ou ALT +020)

Reply

Marsh Posté le 25-03-2010 à 16:26:20    

Salut Fred82,
 
Pour le moment, en ligne de commande en passant par un fichier j'arrive à reproduire l'exemple de ton site, mais j'ai l'impression que j'ai le même soucis qu'avant.
 
C'est à dire que lorsque je crée le fichier depuis mon prog C# le fichier ne doit pas être formaté correctement, car il ne me prends pas le caractère de saut de ligne en compte.
 
Je continue de chercher.
 
merci pour les coups de mains les gars :)
 
Si vous avez d'autres idées je prends.

Reply

Marsh Posté le 25-03-2010 à 17:14:19    

Code :
  1. string message= "";
  2.                     try
  3.                     {
  4.                         //Creation du message
  5.                         for (int i = 0; i < dataset.Tables[0].Rows.Count; i++)
  6.                         {
  7.                             for (int j = 0; j < dataset.Tables[0].Columns.Count; j++)
  8.                             {
  9.                                 message = message +" "+ dataset.Tables[0].Rows[i][j].ToString();
  10.                             }
  11.                             message=message+"\\n\\r";
  12.                         }
  13.                         }


J'ai voulu tester mais étant sous W7, il n'y a plus la commande NET SEND!
As tu essayé en mettant "\n\r" (sans doubler les \\)?

Reply

Marsh Posté le 25-03-2010 à 18:02:34    

Salut breizhbugs,
 
Effectivement la commande n'existe plus sous Windows 7 (dommage d'ailleurs) et elle est désactivé sous Xp (pour l'activer : Services : affichage des messages)
 
Sinon j'ai testé ta solution avec un @ devant et dans ce cas précis il ne m'affiche plus que :
 

Code :
  1. Ligne 1


sans rien derrière. ligne 2 et ligne 3 disparaissent.
 
Mais j'y crois, nous allons trouver !!! :)

Reply

Marsh Posté le 25-03-2010 à 18:33:22    

Et juste "\n"?
(il sert a quoi le @? - je suis nul en c#!)

Reply

Marsh Posté le 26-03-2010 à 00:36:51    


 
Justement il faut que le compilo transforme le "\n\r" en retour a la ligne, chose qu'il ne fait pas faire si vous mettez @ devant parce que c''est pas cmd.exe qui va faire la transformation...
Ca donne quoi "\n\r" sans le @ ?

Reply

Marsh Posté le 26-03-2010 à 11:47:21    

A mon avis sur le fond ça revient au même que le ^T.
Grossièrement le ^ est un symbole pour la touche ctrl et un préfixe en ascii pour spécifier les caractères non affichables, avec une séquence correspondant à chacun.
Par contre l'accent circonflexe tel qu'il est généré en le tapant est peut être un caractère différent de celui qui signifie Ctrl, il doit y avoir une astuce comme ça.

 

edit : ah ben ouais char(20) = ^T, cf le tableau en bas http://en.wikipedia.org/wiki/ASCII [...] characters

 

re-edit : je confirme, quand on fait un tape ctrl G (qui déclenche un Bell) dans l'interpréteur de commande on a bien le bip, et à l'écran ça affiche bien ^G, par contre si on tape à la main ^ et G (ce qui visuellement rend exactement de la même façon), là ça ne marche pas.
Un truc m'échappe peut être mais je pense que le caractère ^ n'a pas le même code dans les deux cas, pourtant dans la table ASCII je n'en vois qu'un. C'est la première fois que je fais joujou avec ça même si je connaissais vaguement les principes, si quelqu'un en sait plus long je suis assez curieux :).


Message édité par TotalRecall le 26-03-2010 à 11:57:59

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 26-03-2010 à 14:15:40    

Ce que l'on voit et ce qui est sont deux choses différentes.
 
C'est comme le "\0" qui marque une fin de chaîne, ce sont deux caractères visuellement, et pourtant c'est représenté en mémoire par un seul. Donc oui, un caractère "^" suivi d'un caractère "T" c'est différent d'un caractère "^T".

Reply

Marsh Posté le 26-03-2010 à 14:38:28    

Mais à la différence du \0 (qui est une spécificité du C et des langages qui en dérivent, pas une commande système) je pensais que l'écriture avec les ^ était interprétée par le shell. Donc soit le ^ "commande" et la diacritique sont deux caractères ascii différents (on ne dirait pas) soit, comme tu dis c'est à la saisie et l'affichage que se fait la gestion du comportement. Vraisemblablement c'est bien ce qui se passe.


Message édité par TotalRecall le 26-03-2010 à 14:38:51

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 29-03-2010 à 07:43:18    

Bonjour Tout le monde,
 
Fred82 merci ça fonctionne nickel !!!
 
Je vous remercie tous pour votre aide.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed