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;
}
}
}
}