IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

C# - passer d'un projet form à console en gardant les évènements


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 22
    Points
    22
    Par défaut C# - passer d'un projet form à console en gardant les évènements
    Bonjour,

    J'ai une application qui tourne avec des fenêtres (form) en C# mais je souhaiterai la faire tourner en console (ou du moins sans qu'elle soit visible)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
        public partial class Form1 : Form
        {
            public Form1()
            {
                ...
            }
     
            private void menuItem1_Click(object sender, EventArgs e)
            {
                ...
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                ... 
     
            }
     
           void MessageReceived(object sender, MessageInterceptorEventArgs e)
            {
               ...
            }
      ...
      }
    Je souhaiterai garder la gestion des évènements par les arguments "sender" et "e" de manière à ce que mon application puisse recevoir des messages et y réagir.

    Je ne vois pas comment faire cela en console et si c'est possible, ou s'il y a possibilité que les fenetres ne s'affichent jamais...

    Merci pour votre aide

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Tu confond un peu les environnements.

    Une application Console n'a par définition par de thread d'affichage (pas de pompe winows) au sens Application windows.
    Elle ne recoit pas d'evenements fenêtrés, donc aucun evenement en provenance du desktop.

    Quand tu la vois s'afficher dans une fenêtre de console, il faut que tu soit conscient qu'en réalité, c'est un shell de commande (CMD) qui est exécuté et qui execute ton application... cela signifie, que les evenement souris que tu fait sur cette fenetre de console, ton application ne peux pas les récupéré car ils sont transmis au shell (cmd) et pas à ton application, qui n'est jamais qu'un process exécuté par le shell.

    Ton appli peut traiter la file de message des formulaires si et seulement si tu utilise Application.Run() mais là ton applicatif va passer en mode "Formulaire" et avoir un thread et donc tes formulaires serons visible.
    De toute facon je ne vois pas l'interet de migrer un programme winforms en console... c'est comme avancer à reculons.
    Et si tu cache tes formulaires, comment espère tu qu'ils recoivent le moindre évenement, puisque par définition une fois cachés l'utilisateur ne peut interagir avec eux.

    Sinon globallement le passage en console ne pose aucun probleme tu peux laisser tes handlers d'évenements tels qu'ils sont... cependant si tu cherche à les appeler, tu devra le faire toi meme et émuler les paramètres.

    Sinon c'est que j'ai absolument rien compris à ton problème et qu'il faudrait envisager d'être plus clair...
    Deja pour commencer, en quelle horreur a tu besoin de migrer une appli winform vers une appli console ? (le contraire est aisément concevable, mais là pas trop, j'aurais meme aisément compris une migration winform/WPF...)

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    Merci pour ta réponse. Je ne suis pas à l'aise en C#, mais tu m'as éclaircis en partie. Et je crois que tu as bien répondu et bien vu là où je voulais en venir.

    J'ai récupéré un sample qui est codé sous forme de form mais je souhaiterai qu'il fasse le même travail mais sans afficher les fenêtre.

    Il s'agit du SMSinterceptor > http://msdn2.microsoft.com/en-us/lib....aspx#Examples

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    namespace SMSinterceptor
    {
     
    public partial class Form1 : Form
    {
     
    MessageInterceptor _smsInterceptor = null;
     
    public Form1()
    {
        InitializeComponent();
    }
     
    private void Form1_Load(object sender, EventArgs e)
    {
        // Default constructor indicates that message handling should occur
        // on the main application thread, and message should be passed
        // to other message interceptors and to the SMS message reader
        _smsInterceptor = new MessageInterceptor();
        // The name is reported in the form of the Contact's File As field
        // Therefore must check for "Smith, John", not "John Smith"
        _smsInterceptor.MessageCondition = 
            new MessageCondition(MessageProperty.Sender, 
            MessagePropertyComparisonType.Contains, "Smith, John", false);
        _smsInterceptor.MessageReceived += SmsInterceptor_MessageReceived;
    }
     
    void SmsInterceptor_MessageReceived(object sender, MessageInterceptorEventArgs e)
    {
        // Cast to SmsMessage to access message body
        // Not expecting to receive any non-SMS messages but use "as" to
        // cast to be extra safe
        SmsMessage newMessage = e.Message as SmsMessage;
        if (newMessage != null)
        {
            statusBar1.Text = "From:" + newMessage.From.Address;
            Debug.WriteLine(string.Format("Sender:{0} - Body:{1}", _
              newMessage.From.Address, newMessage.Body));
        }
    }
     
    private void Form1_Closed(object sender, EventArgs e)
    {
        if (_smsInterceptor != null)
        {
            // Remove event handler to assure proper registry cleanup
            _smsInterceptor.MessageReceived -= SmsInterceptor_MessageReceived;
            _smsInterceptor.Dispose();
        } 
    }
     
    }
     
    }
    et le code du Form1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
        partial class Form1
        {
            private System.ComponentModel.IContainer components = null;
            private System.Windows.Forms.MainMenu mainMenu1;
     
            private void InitializeComponent()
            {
                this.mainMenu1 = new System.Windows.Forms.MainMenu();
                this.menuItem1 = new System.Windows.Forms.MenuItem();
                this.statusBar1 = new System.Windows.Forms.StatusBar();
                this.notifyCommand = new Microsoft.WindowsCE.Forms.Notification();
                this.DisablePersistentNotification = new System.Windows.Forms.MenuItem();
                this.SuspendLayout();
                // 
                // mainMenu1
                // 
                this.mainMenu1.MenuItems.Add(this.menuItem1);
                this.mainMenu1.MenuItems.Add(this.DisablePersistentNotification);
                // 
                // menuItem1
                // 
                this.menuItem1.Text = "Quit";
                this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click);
                // 
                // statusBar1
                // 
                this.statusBar1.Location = new System.Drawing.Point(0, 246);
                this.statusBar1.Name = "statusBar1";
                this.statusBar1.Size = new System.Drawing.Size(240, 22);
                this.statusBar1.Text = "Waiting Command";
                // 
                // DisablePersistentNotification
                // 
                this.DisablePersistentNotification.Text = "Disable Persistent";
                this.DisablePersistentNotification.Click += new System.EventHandler(this.DisablePersistentNotification_Click);
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
                this.AutoScroll = true;
                this.ClientSize = new System.Drawing.Size(240, 268);
                this.Controls.Add(this.statusBar1);
                this.Menu = this.mainMenu1;
                this.Name = "Form1";
                this.Text = "SMSinterceptor";
                this.Closed += new System.EventHandler(this.Form1_Closed);
                this.Load += new System.EventHandler(this.Form1_Load);
                this.ResumeLayout(false);
     
            }
     
            private System.Windows.Forms.MenuItem menuItem1;
            private System.Windows.Forms.StatusBar statusBar1;
            private Microsoft.WindowsCE.Forms.Notification notifyCommand;
            private System.Windows.Forms.MenuItem DisablePersistentNotification;
        }
    J'ai lu que "The MessageInterceptor instance is handling the message notifications on the main application thread."

    En fait, je ne suis pas sûr de pouvoir utiliser un MessageInterceptor sans Form, mais ça me paraîtrait bizarre quand même de ne pas pouvoir.

    Merci d'avance

    Edit: j'ai trouvé ce lien ( http://www.developpez.net/forums/sho...d.php?t=200585 ) sur le forum mais ça ne m'aide pas trop...

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/08/2007, 14h30
  2. [VB.NET]Passer des variable de form en form ? Débutant
    Par johnvox dans le forum Windows Forms
    Réponses: 7
    Dernier message: 25/12/2006, 19h28
  3. Moteur3d multi plate-forme (console)
    Par eddie1157 dans le forum Moteurs 3D
    Réponses: 23
    Dernier message: 10/04/2006, 12h24
  4. Réponses: 4
    Dernier message: 31/03/2006, 15h16
  5. Réponses: 5
    Dernier message: 08/03/2006, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo