using System; using System.Diagnostics; using System.Media; using System.Windows.Forms; using Microsoft.Win32; using Microsoft.WindowsMobile.PocketOutlook; using Microsoft.WindowsMobile.PocketOutlook.MessageInterception; namespace SMSInterceptor { public partial class Form1 : Form { public Form1() { InitializeComponent(); } #region Déclaration des constantes public static MessageInterceptor[] _mi = null; bool bFirstOpen = true; private const string ALERTE_WAV = @"\Windows\Infbeg.wav"; private DateTime _lastAlerte = DateTime.Now.AddYears(-1); private object _alerteLock = new object(); private const int ALERTE_DURATION = 5; private bool _alerte = false; public static int intK = 0; public static int intCptmi = 0; #endregion /// /// /// /// public void Form1_Load(object sender, EventArgs e) { SmsInterceptorLauncher(); this.Activate(); } /// /// Point d'entrée principal de la fonction SMSInterceptor /// public void SmsInterceptorLauncher() { // Récupération des mots clefs issus du fichier "\Flash Disk\G2W_Setup\GIMI\Param\SMSKeyWord.txt" ManipulationFichiers.recuperationMotsClefs(); #region Suppression des notifications existantes RegistryKey rkSmsRules = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Inbox", true); try { if (rkSmsRules != null) { rkSmsRules.DeleteSubKeyTree("Rules"); } rkSmsRules.Close(); } catch { // Gestion de l'erreur due à la suppression des clefs de registre ci dessus // sur le principe, on ne fait rien et on passe à la suite via " finally " } #endregion finally { #region Création des nouvelles règles de filtrage SMS - HKEY_LOCAL_MACHINE\Software\Microsoft\Inbox\Rules - try { // indique à l'instance "MessageInterceptor" le nombre de filtre à prévoir + 1 pour les SMS qui doivent être rejetés _mi = new MessageInterceptor[(ManipulationFichiers.intNbreTotalMotsClefs * 2)]; //Création du filtre se chargeant de tous les messages qui ne concernent ni le projet, ni MediaContact donc, les msg publicitaires et autres... for (int h = 0; h < ManipulationFichiers.intNbreMotsClefsMediaContact; h++) { intCptmi = intCptmi + 1; _mi[h] = new MessageInterceptor(InterceptionAction.NotifyAndDelete, false); _mi[h].MessageCondition = new MessageCondition(MessageProperty.Body, MessagePropertyComparisonType.NotEqual, "", true); _mi[h].MessageReceived += new MessageInterceptorEventHandler(SmsInterceptor_MessageReceived_OnThread); } // création d'autant de filtres "MessageInterceptor" qu'il y a de mots clefs MediaContact for (int j = intCptmi; j < ManipulationFichiers.intNbreMotsClefsMediaContact * 2; j++) { intCptmi = intCptmi + 1; _mi[intCptmi] = new MessageInterceptor(InterceptionAction.Notify, false); _mi[intCptmi].MessageCondition = new MessageCondition(MessageProperty.Body, MessagePropertyComparisonType.Contains, ManipulationFichiers.listKeyWordMediacontact[intK], false); _mi[intCptmi].MessageReceived += new MessageInterceptorEventHandler(SmsInterceptor_MessageReceived_OnThread); intK = intK + 1; } } #endregion // Gestion des erreurs catch (Exception ex) { MessageBox.Show("Erreur d'origine inconnue à ce jour..."); } } } /// /// Fonction permettant d'intercepter tous les SMS puis d'effectuer un filtre sur le contenu du message /// /// /// public void SmsInterceptor_MessageReceived_OnThread(object sender, MessageInterceptorEventArgs e) { SmsMessage newMessage = e.Message as SmsMessage; if (newMessage != null) { // Déclaration des variables DateTime dt = DateTime.Now; string strDate = string.Format("{0:dddd d MMM yyyy - HH\\hmm}", dt); string strEmetteur = newMessage.From.Name; string strObjet = newMessage.From.Address; string strMsg = newMessage.Body; string strFiltre = newMessage.Body.ToString().ToLower(); #region Contrôle de la présence d'un mot clef "métier" dans le corps du message foreach (string strMotClef in ManipulationFichiers.listKeyWordMetier) { if (strFiltre.Contains(strMotClef)) { // Si le mot clef est présent, on l'affiche à l'utilisateur // On ne peut pas interagir directement sur le formulaire, on passe donc par une méthode // BeginInvoke pour y arriver #region Affichage de la Date/Heure de réception du message statusBar1.BeginInvoke((MethodInvoker)delegate { statusBar1.Text = strDate; }); Debug.WriteLine(string.Format("Date de réception :{0}", strDate)); #endregion #region Affichage de l'emetteur du SMS //_InputEmetteur.BeginInvoke((MethodInvoker)delegate // { // _InputEmetteur.Text = strEmetteur; // }); //Debug.WriteLine(strEmetteur); #endregion #region Affichage de l'objet du SMS //_InputObjet.BeginInvoke((MethodInvoker)delegate // { // _InputObjet.Text = strEmetteur; // }); //Debug.WriteLine(strEmetteur); #endregion #region Affichage du contenu du SMS _InputMessage.BeginInvoke((MethodInvoker)delegate { _InputMessage.Text = strMsg; }); Debug.WriteLine(strMsg); #endregion #region Affichage du formulaire en plein écran this.BeginInvoke((MethodInvoker)delegate { this.Show(); this.TopMost = false; }); #endregion alert(); return; } } #endregion #region Contrôle de la présence d'un mot clef "mediacontact" dans le corps du message foreach (string strMotClef in ManipulationFichiers.listKeyWordMediacontact) { if (strFiltre.Contains(strMotClef)) { // Si le mot clef est présent, on le laisse passer pour MédiaContact return; } } #endregion #region je ne fais rien et le message n'apparait pas ! this.BeginInvoke((MethodInvoker)delegate { this.Hide(); }); #endregion } } // #if vous permet de commencer une directive conditionnelle, en testant un ou plusieurs symboles pour vérifier s'ils ont pour valeur true. // S'ils ont la valeur true, le compilateur évalue tout le code entre la directive #if et la directive #endif la plus proche. // MethodInvoker is a delegate with no arguments and no return value // MethodInvoker is part of the full .NET Framework but not the // .NET Compact Framework so must declare explicitly #if PocketPC || Smartphone delegate void MethodInvoker(); #endif /// /// Fonction permettant de jouer un son à l'arrivée d'un SMS /// private void alert() { if (_lastAlerte.CompareTo(DateTime.Now.AddSeconds(0 - ALERTE_DURATION - 10)) < 0) { _alerte = true; SoundPlayer player = new SoundPlayer(ALERTE_WAV); player.PlaySync(); player.Dispose(); _lastAlerte = DateTime.Now; _alerte = false; } } /// /// Fonction permettant de minimiser le formulaire lors du clic sur le bouton " Prise en compte " /// /// /// private void _buttonPEC_Click(object sender, EventArgs e) { this.Hide(); } /// /// Fonction permettant de minimiser le formulaire au démarrage de l'application /// /// /// private void Form1_Activated(object sender, EventArgs e) { // Si c'est le lancement initial de l'application, on l'a met en mode réduit, // si ce n'est pas le premier lancement, mais suite à prise en compte du message, on sort if (bFirstOpen == true) { this.Hide(); bFirstOpen = false; } } } }