Bonjour,

J'ai toujours trouvé ça pratique de pouvoir discuter avec mes collègues via un système de messagerie instantanée. Plus rapide que le mail et moins intrusif que le téléphone.
J'ai eu accès à des logiciels d'entreprise, comme SameTime par exemple pour ceux qui connaissent, mais ce n'est plus le cas. J'ai utilisé un peu le Chat Gmail, mais il vient d'être bloqué. Et autant dire que les systèmes standard sont bloqués de partout. Même NetSend ne marche pas.
Du coup, j'ai décidé de développer une petite application pour ça et la seule idée que j'ai eu était de passer par un fichier dans un répertoire auquel les utilisateurs avaient accès.

J'ai fait ça très rapidement donc c'est sûrement largement perfectible, surtout que je ne suis pas développeur de formation ou de métier.
Voici donc le résultat :


Pour le moment, j'utilise un fichier par utilisateur et par conversation. C'est ça qui est le moins pratique à mon avis mais bon, c'est un début. Je ne l'utilise qu'avec une personne pour le moment donc je n'ai pas mis de mot de passe, mais c'est un étape indispensable si on veut passer à plus d'une personne.
Voici tout d'abord le fichier app.config avec les chemins et le pseudo :
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
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<connectionStrings>
		<!-- Example connection to a SQL Server Database on localhost. -->
		<!-- <add name="ExampleConnectionString"
			connectionString="Data Source=.;Initial Catalog=DBName;Integrated Security=True"
			providerName="System.Data.SqlClient" /> -->
	</connectionStrings>
	<appSettings>
		<!-- access these values via the property:
			System.Configuration.ConfigurationManager.AppSettings[key]
		-->
		<add key="cheminUtilisateur" value="D:\DONNEES\testChat\FichiersDiscussion\fichierUser" />
		<add key="cheminDestinataire" value="D:\DONNEES\testChat\FichiersDiscussion\fichierCorrespondant" />
		<add key="nomUtilisateur" value="monPseudo" />
 	</appSettings>
</configuration>
Ensuite, voilà la classe qui sert à stocker les messages. Je les sérialize dans un fichier binaire que je crypte ensuite pour qu'il ne soit lisible avec notepad.
clsListeMessages.cs
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;
 
namespace sebChat
{
	/// <summary>
	/// Une liste de message pour un utilisateur
	/// </summary>
	[Serializable]
	public class clsListeMessages
	{
		/// <summary>
		/// Le nom de la personne ayant écrit le message
		/// </summary>
		public string NomUtilisateur { get; set; }
		/// <summary>
		/// La liste des messages
		/// </summary>
		public List<clsMessage> ListeMessages { get; set; }
		/// <summary>
		/// Dernière date et heure d'activité de l'application
		/// </summary>
		public DateTime DerniereVerifActivite { get; set; }
		/// <summary>
		/// Pour savoir si l'utilisateur bouge sa souris ou pas
		/// </summary>
		public bool UtilisateurActif { get; set; }
 
		public clsListeMessages()
		{
			ListeMessages=new List<clsMessage>();
		}
 
		/// <summary>
		/// Sérialise la liste des messages dans un fichier, avec un cryptage
		/// </summary>
		/// <param name="fileName">Le nom du fichier</param>
		/// <param name="algoChiffrement">Pour le cryptage</param>
		public void Save(string fileName, RijndaelManaged algoChiffrement)
		{
			int nbEssai = 0;
			bool saveOk = false;
 
			while (saveOk == false) {
				try {
					FileStream fs = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.Read);
					CryptoStream cs = new CryptoStream(fs, algoChiffrement.CreateEncryptor(), CryptoStreamMode.Write);
					BinaryFormatter fm = new BinaryFormatter();
 
					fm.Serialize(cs, this);
 
					cs.Close();
					fs.Close();
					saveOk = true;
				} catch (Exception) {}
 
				if (nbEssai > 5) {
					throw new Exception("L'écriture dans le fichier a échouée 5 fois");
				}
 
				nbEssai++;
			}
		}
 
		/// <summary>
		/// Lit un fichier de messages, le décrypte et le désérialise
		/// </summary>
		/// <param name="fileName">Le nom du fichier</param>
		/// <param name="algoChiffrement">Pour le décryptage</param>
		/// <returns>Liste de messages</returns>
		public static clsListeMessages Load(string fileName, RijndaelManaged algoChiffrement)
		{
			FileStream fs;
			CryptoStream cs;
			BinaryFormatter fm = new BinaryFormatter();
			clsListeMessages lm;
 
			try {
				fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Write);
				cs = new CryptoStream(fs, algoChiffrement.CreateDecryptor(), CryptoStreamMode.Read);
				lm = (clsListeMessages)fm.Deserialize(cs);
 
				cs.Close();
				fs.Close();
 
				return lm;
 
			} catch (Exception) {
				return new clsListeMessages();
			}
		}
	}
 
	/// <summary>
	/// Un message
	/// </summary>
	[Serializable]
	public class clsMessage
	{
		/// <summary>
		/// La date du message
		/// </summary>
		public DateTime DateMessage { get; set; }
		/// <summary>
		/// Le contenu du message
		/// </summary>
		public string Message { get; set; }
		/// <summary>
		/// Type de rédacteur, ne servira qu'à la reconstitution
		/// </summary>
		public eTypeRedacteur TypeRedacteur { get; set; }
	}
 
	/// <summary>
	/// Pour savoir si le rédacteur d'un message est l'utilisateur ou le destinataire
	/// </summary>
	public enum eTypeRedacteur : byte
	{
		Utilisateur = 1,
		Destinataire = 2
	}
 
}
Ensuite le code de la discussion, utilisant 2 listes de messages
clsDiscussion.cs
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
 
namespace sebChat
{
	/// <summary>
	/// Une discussion entre 2 utilisateurs
	/// </summary>
	public class clsDiscussion
	{
		private clsListeMessages _msgUtilisateur;
		private clsListeMessages _msgDestinataire;
		private DateTime _dernierMessageRecu;
		private clsListeMessages _msgComplet;
		private RijndaelManaged algoChiffrement;
 
		/// <summary>
		/// Le chemin du fichier de sauvegarde de l'utilisateur
		/// </summary>
		public string CheminUtilisateur { get; set; }
		/// <summary>
		/// Le chemin du fichier de sauvegarde du correspondant
		/// </summary>
		public string CheminDestinataire { get; set; }
		/// <summary>
		/// Indique si un nouveau message a été reçu ou pas
		/// </summary>
		public bool NouveauMessage { get; set; }
		/// <summary>
		/// La liste complete des messages
		/// </summary>
		public clsListeMessages ListeComplete
		{ get { return _msgComplet; } }
		/// <summary>
		/// Le nom de l'utilisateur
		/// </summary>
		public string NomUtilisateur { get; set; }
		/// <summary>
		/// Le nom du destinataire
		/// </summary>
		public string NomDestinataire { get; set; }
		/// <summary>
		/// Si l'utilisateur bouge sa souris
		/// </summary>
		public bool DestinataireActif { get{ return _msgDestinataire.UtilisateurActif; } }
		/// <summary>
		/// Heure de dernière activité du destinataire, pour savoir si son appli est lancée
		/// </summary>
		public DateTime DerniereActiviteDestinataire { get{ return _msgDestinataire.DerniereVerifActivite; } }
		/// <summary>
		/// La souris est active ou pas
		/// </summary>
		public bool SourisActive { get; set; }
 
		public clsDiscussion()
		{
			CheminUtilisateur = "";
			CheminDestinataire = "";
			NomUtilisateur = System.Configuration.ConfigurationManager.AppSettings["nomUtilisateur"];
			InitAlgoChiffrement();
		}
 
		//Initialise l'algorithme de cryptage
		private void InitAlgoChiffrement()
		{
			algoChiffrement = new RijndaelManaged();
			Rfc2898DeriveBytes cle = new Rfc2898DeriveBytes("123456789", Encoding.ASCII.GetBytes("Un peu de sel"));
			algoChiffrement.Key = cle.GetBytes(algoChiffrement.KeySize/8);
			algoChiffrement.IV = cle.GetBytes(algoChiffrement.BlockSize/8);
		}
 
		/// <summary>
		/// Lit les messages de l'utilisateur à partir du fichier
		/// </summary>
		public void LireMessagesUtilisateur()
		{
			_msgUtilisateur = clsListeMessages.Load(CheminUtilisateur, algoChiffrement);
		}
 
		/// <summary>
		/// Lit les message de l'interlocuteur à partir du fichier et vérifie s'il y en a des nouveaux
		/// </summary>
		public void LireMessagesDestinataire()
		{
			_msgDestinataire = clsListeMessages.Load(CheminDestinataire, algoChiffrement);
			NomDestinataire = (_msgDestinataire.NomUtilisateur == null) ? "Destinataire" : _msgDestinataire.NomUtilisateur;
 
			//Vérification d'un nouveau message
			DateTime dernierMsg;
 
			var rq = from m in _msgDestinataire.ListeMessages
				orderby m.DateMessage
				select m;
 
			if (rq.Count() > 0) {
				dernierMsg = rq.Last().DateMessage;
 
				NouveauMessage = (dernierMsg > _dernierMessageRecu);
 
				_dernierMessageRecu = dernierMsg;
			}
			else {
				NouveauMessage = false;
			}
		}
 
		/// <summary>
		/// Ecrit un message dans le fichier utilisateur
		/// </summary>
		/// <param name="strMsg">Le contenu du message</param>
		public void EcrireMessageUtilisateur(string strMsg)
		{
			clsMessage msg = new clsMessage();
			msg.DateMessage = DateTime.Now;
			msg.Message = strMsg;
			_msgUtilisateur.ListeMessages.Add(msg);
			_msgUtilisateur.NomUtilisateur = NomUtilisateur;
			_msgUtilisateur.Save(CheminUtilisateur, algoChiffrement);
		}
 
		public void DefinirActiviteSouris()
		{
			_msgUtilisateur.UtilisateurActif = SourisActive;
			_msgUtilisateur.Save(CheminUtilisateur, algoChiffrement);
		}
 
		/// <summary>
		/// Entre dans le fichier l'heure d'activité pour vérification d'application active
		/// </summary>
		public void EntrerHeureActivite()
		{
			_msgUtilisateur.DerniereVerifActivite = DateTime.Now;
			_msgUtilisateur.Save(CheminUtilisateur, algoChiffrement);
		}
 
		/// <summary>
		/// Regroupe les listes de message utilisateur et correspondant en y ajoutant les informations sur la personne qui a écrit chaque message
		/// </summary>
		public void ConstruitListeComplete()
		{
			_msgComplet = new clsListeMessages();
 
			foreach (clsMessage tmpMsg in _msgUtilisateur.ListeMessages) {
				tmpMsg.TypeRedacteur = eTypeRedacteur.Utilisateur;
				_msgComplet.ListeMessages.Add(tmpMsg);
			}
 
			foreach (clsMessage tmpMsg in _msgDestinataire.ListeMessages) {
				tmpMsg.TypeRedacteur = eTypeRedacteur.Destinataire;
				_msgComplet.ListeMessages.Add(tmpMsg);
			}
		}
 
 
	}
 
}
Et pour finir le code du userForm, dans lequel j'utilise une CheckBox chbxAlerte pour savoir si on active les alertes de nouveau message (clignotement dans la barre des tâches), un Label lblCorrespondant pour connaitre l'activité du correspondant (connecté, absent - je teste le déplacement de la souris, présent), une DataGridView dgHisto pour l'historique des messages, un TextBox txtMessage pour écrire un message, un Button btnSend pour l'envoi du message (fonctionne aussi en appuyant sur Enter), et un Timer timerCheck pour vérifier les nouveaux messages, l'activité....
De toute façon, je mets aussi le code du designer...
MainForm.cs
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Linq;
using System.Runtime.InteropServices;
 
namespace sebChat
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class MainForm : Form
	{
		[DllImport("user32.dll")]
		private static extern bool FlashWindow(IntPtr hwnd, bool bInvert); //Pour faire clignoter lors d'une alerte
 
		private clsDiscussion _discussion;
		private Point _dernierePositionSouris;
		private int _nbTick;
		private int _nbTickSourisInactive;
 
		public MainForm()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
 
			//
			_discussion = new clsDiscussion();
			_discussion.CheminUtilisateur = System.Configuration.ConfigurationManager.AppSettings["cheminUtilisateur"];
			_discussion.CheminDestinataire = System.Configuration.ConfigurationManager.AppSettings["cheminDestinataire"];
 
			//Première lecture
			_discussion.LireMessagesUtilisateur();
			_discussion.LireMessagesDestinataire();
			_discussion.ConstruitListeComplete();
 
			//Config du datagrid
			dgHisto.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
			RemplirListView();
 
			//Config des timers
			timerCheck.Start();
 
			_dernierePositionSouris = Cursor.Position;
			_discussion.SourisActive = false;
			_nbTick = 0;
			_nbTickSourisInactive = 0;
			//
		}
 
		//Remplissage du datagrid
		private void RemplirListView()
		{
			var rq = from m in _discussion.ListeComplete.ListeMessages
				orderby m.DateMessage descending
				select m;
 
			dgHisto.Rows.Clear();
 
			DataGridViewRow dgRow;
			string nom;
 
			foreach (clsMessage msg in rq) {
				dgRow = new DataGridViewRow();
 
				nom = (msg.TypeRedacteur == eTypeRedacteur.Utilisateur) ? _discussion.NomUtilisateur : _discussion.NomDestinataire;
 
				dgRow.CreateCells(dgHisto);
				dgRow.Cells[0].Value = nom + Environment.NewLine + msg.DateMessage.ToString("dd/MM/yyyy") + Environment.NewLine 
					+ msg.DateMessage.ToString("H'h'mm");
				dgRow.Cells[1].Value = msg.Message;
 
				if (msg.TypeRedacteur == eTypeRedacteur.Utilisateur) {
					dgRow.DefaultCellStyle.BackColor = Color.LightGray;	
				}
 
				dgRow.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
 
				dgHisto.Rows.Add(dgRow);
			}
 
			dgHisto.ClearSelection();
		}
 
		//Envoi d'un message
		void BtnSendClick(object sender, EventArgs e)
		{
			if (txtMessage.Text != "") {
				try {
					_discussion.EcrireMessageUtilisateur(txtMessage.Text);
				} catch (Exception ex) {
					MessageBox.Show(ex.Message);
				}
 
				_discussion.ConstruitListeComplete();
				RemplirListView();
				txtMessage.Text = "";
			}
		}
 
		//Pour empêcher la selection d'une ligne du datagrid
		void DgHistoSelectionChanged(object sender, EventArgs e)
		{
			dgHisto.ClearSelection();
		}
 
		//Le timer de check des messages du correspondant
		void TimerCheckTick(object sender, EventArgs e)
		{
			_nbTick++;
 
			//Vérification des messages
			if ((_nbTick % 2) == 0) { //Toutes les 2s
				VerifMessages();
			}
 
			//Vérification de l'inactivité de la souris
			VerifSouris();
 
			//Vérification de l'activité
			VerifEtatAutre();
 
			if ((_nbTick % 30) == 0) { //Toutes les 30 s, on entre l'heure pour la vérification d'activité
				_discussion.EntrerHeureActivite();
			}
 
			if (_nbTick >= 3600) { _nbTick = 0; } //On réinitialise au bout d'une heure
		}
 
		//Vérification des nouveaux messages
		private void VerifMessages() {
			_discussion.LireMessagesDestinataire();
 
			//S'il y a un nouveau message on l'affiche
			if (_discussion.NouveauMessage) {
				_discussion.ConstruitListeComplete();
				RemplirListView();
 
				//Alerte nouveau message
				if (chbxAlerte.Checked && this.ContainsFocus == false) {
					FlashWindow(this.Handle, true); //Faire clignoter dans la barre des tâches
				}
			}
		}
 
		//Vérification de l'activité de la souris
		private void VerifSouris() {
			if (Cursor.Position == _dernierePositionSouris) { //Si on n'a pas changer de position
				_nbTickSourisInactive++; //On augmente le compteur
				if (_nbTickSourisInactive >= 120) { //Si ça fait plus de 2 min qu'on n'a pas bougé
					if (_discussion.SourisActive == true) { //Si on était actif avant, on passe en mode inactif
						_discussion.SourisActive = false;
						_discussion.DefinirActiviteSouris();
					}
				}
			}
			else //Si on change de position
			{
				_nbTickSourisInactive = 0; //On réinitialise le compteur
				_dernierePositionSouris = Cursor.Position; //On met à jour la dernière position
				if (_discussion.SourisActive == false) { //Si on était inactif, on passe en mode actif
					_discussion.SourisActive = true;
					_discussion.DefinirActiviteSouris();
				}
			}
		}
 
		//Vérification de l'état du correspondant
		private void VerifEtatAutre() {
			if (_discussion.DerniereActiviteDestinataire < DateTime.Now.AddMinutes(-1)) { //Si ça fait plus d'une minute par rapport à la dernière heure entrée par l'utilisateur
				lblCorrespondant.Text = "Correspondant non connecté";
				lblCorrespondant.BackColor = Color.Red;
			}
			else {
				if (_discussion.DestinataireActif) {
					lblCorrespondant.Text = "Correspondant actif";
					lblCorrespondant.BackColor = Color.Green;
				}
				else {
					lblCorrespondant.Text = "Correspondant inactif";
					lblCorrespondant.BackColor = Color.Orange;
				}
			}
		}
 
	}
}
MainForm.Designer.cs
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
namespace sebChat
{
	partial class MainForm
	{
		/// <summary>
		/// Designer variable used to keep track of non-visual components.
		/// </summary>
		private System.ComponentModel.IContainer components = null;
 
		/// <summary>
		/// Disposes resources used by the form.
		/// </summary>
		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
		protected override void Dispose(bool disposing)
		{
			if (disposing) {
				if (components != null) {
					components.Dispose();
				}
			}
			base.Dispose(disposing);
		}
 
		/// <summary>
		/// This method is required for Windows Forms designer support.
		/// Do not change the method contents inside the source code editor. The Forms designer might
		/// not be able to load this method if it was changed manually.
		/// </summary>
		private void InitializeComponent()
		{
			this.components = new System.ComponentModel.Container();
			System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
			System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
			this.txtMessage = new System.Windows.Forms.TextBox();
			this.btnSend = new System.Windows.Forms.Button();
			this.dgHisto = new System.Windows.Forms.DataGridView();
			this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
			this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
			this.timerCheck = new System.Windows.Forms.Timer(this.components);
			this.chbxAlerte = new System.Windows.Forms.CheckBox();
			this.lblCorrespondant = new System.Windows.Forms.Label();
			((System.ComponentModel.ISupportInitialize)(this.dgHisto)).BeginInit();
			this.SuspendLayout();
			// 
			// txtMessage
			// 
			this.txtMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
									| System.Windows.Forms.AnchorStyles.Right)));
			this.txtMessage.Location = new System.Drawing.Point(7, 480);
			this.txtMessage.Multiline = true;
			this.txtMessage.Name = "txtMessage";
			this.txtMessage.Size = new System.Drawing.Size(420, 90);
			this.txtMessage.TabIndex = 1;
			// 
			// btnSend
			// 
			this.btnSend.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
			this.btnSend.Location = new System.Drawing.Point(433, 481);
			this.btnSend.Name = "btnSend";
			this.btnSend.Size = new System.Drawing.Size(65, 50);
			this.btnSend.TabIndex = 2;
			this.btnSend.Text = "Envoyer";
			this.btnSend.UseVisualStyleBackColor = true;
			this.btnSend.Click += new System.EventHandler(this.BtnSendClick);
			// 
			// dgHisto
			// 
			this.dgHisto.AllowUserToAddRows = false;
			this.dgHisto.AllowUserToDeleteRows = false;
			this.dgHisto.AllowUserToResizeColumns = false;
			this.dgHisto.AllowUserToResizeRows = false;
			this.dgHisto.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
									| System.Windows.Forms.AnchorStyles.Left) 
									| System.Windows.Forms.AnchorStyles.Right)));
			this.dgHisto.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
			this.dgHisto.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
			this.dgHisto.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;
			this.dgHisto.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
			this.dgHisto.ColumnHeadersVisible = false;
			this.dgHisto.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
									this.Column1,
									this.Column2});
			this.dgHisto.Location = new System.Drawing.Point(8, 35);
			this.dgHisto.MultiSelect = false;
			this.dgHisto.Name = "dgHisto";
			this.dgHisto.ReadOnly = true;
			this.dgHisto.RowHeadersVisible = false;
			this.dgHisto.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
			this.dgHisto.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
			this.dgHisto.Size = new System.Drawing.Size(489, 435);
			this.dgHisto.TabIndex = 3;
			this.dgHisto.SelectionChanged += new System.EventHandler(this.DgHistoSelectionChanged);
			// 
			// Column1
			// 
			dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
			this.Column1.DefaultCellStyle = dataGridViewCellStyle1;
			this.Column1.FillWeight = 21.05372F;
			this.Column1.HeaderText = "Column1";
			this.Column1.MinimumWidth = 40;
			this.Column1.Name = "Column1";
			this.Column1.ReadOnly = true;
			this.Column1.Resizable = System.Windows.Forms.DataGridViewTriState.False;
			// 
			// Column2
			// 
			dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
			this.Column2.DefaultCellStyle = dataGridViewCellStyle2;
			this.Column2.FillWeight = 82.63584F;
			this.Column2.HeaderText = "Column2";
			this.Column2.Name = "Column2";
			this.Column2.ReadOnly = true;
			this.Column2.Resizable = System.Windows.Forms.DataGridViewTriState.False;
			// 
			// timerCheck
			// 
			this.timerCheck.Interval = 1000;
			this.timerCheck.Tick += new System.EventHandler(this.TimerCheckTick);
			// 
			// chbxAlerte
			// 
			this.chbxAlerte.Location = new System.Drawing.Point(12, 5);
			this.chbxAlerte.Name = "chbxAlerte";
			this.chbxAlerte.Size = new System.Drawing.Size(104, 24);
			this.chbxAlerte.TabIndex = 4;
			this.chbxAlerte.Text = "Alerte activée";
			this.chbxAlerte.UseVisualStyleBackColor = true;
			// 
			// lblCorrespondant
			// 
			this.lblCorrespondant.Location = new System.Drawing.Point(133, 7);
			this.lblCorrespondant.Name = "lblCorrespondant";
			this.lblCorrespondant.Size = new System.Drawing.Size(237, 19);
			this.lblCorrespondant.TabIndex = 5;
			this.lblCorrespondant.Text = "Recherche d\'info sur correspondant";
			this.lblCorrespondant.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
			// 
			// MainForm
			// 
			this.AcceptButton = this.btnSend;
			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
			this.ClientSize = new System.Drawing.Size(510, 581);
			this.Controls.Add(this.lblCorrespondant);
			this.Controls.Add(this.chbxAlerte);
			this.Controls.Add(this.dgHisto);
			this.Controls.Add(this.btnSend);
			this.Controls.Add(this.txtMessage);
			this.Name = "MainForm";
			this.Text = "Chat By Seb";
			((System.ComponentModel.ISupportInitialize)(this.dgHisto)).EndInit();
			this.ResumeLayout(false);
			this.PerformLayout();
		}
		private System.Windows.Forms.Label lblCorrespondant;
		private System.Windows.Forms.CheckBox chbxAlerte;
		private System.Windows.Forms.Timer timerCheck;
		private System.Windows.Forms.DataGridView dgHisto;
		private System.Windows.Forms.DataGridViewTextBoxColumn Column2;
		private System.Windows.Forms.DataGridViewTextBoxColumn Column1;
		private System.Windows.Forms.Button btnSend;
		private System.Windows.Forms.TextBox txtMessage;
	}
}
J'espère que ça pourra servir à quelqu'un et si vous avez des retours ou des remarques, n'hésitez pas !