Comment utiliser le HOOK pour capturer les messages Windows

AlexBob789 Messages postés 8 Date d'inscription mardi 2 mars 2004 Statut Membre Dernière intervention 14 septembre 2008 - 13 sept. 2008 à 03:18
AlexBob789 Messages postés 8 Date d'inscription mardi 2 mars 2004 Statut Membre Dernière intervention 14 septembre 2008 - 14 sept. 2008 à 15:30
BobAlex

4 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 sept. 2008 à 10:56
Je crois que le message est passé a la trappe ?
Ou alors il faut juste lire le titre ?

Mx
MVP C# 
0
AlexBob789 Messages postés 8 Date d'inscription mardi 2 mars 2004 Statut Membre Dernière intervention 14 septembre 2008
13 sept. 2008 à 21:15
Bonjour,
Voci le message original:

Voilà cela un moment je tente de capturer les messages windows entrant et sortant de outlook 2003, mais je n'arrive pas. En faite qd l'usager clicque sur le boutton de send ou receive du Menu de Outlook ou qu'un email arrive dans le repertoire Inbox il ya des messages windows qui sont déclenchés, et j'aimerai les capturer.
Pour cela j'utilise la fonction SetWindowsHookEx mais cela ne marche pas. Voici brievement le code:


private IntPtr FindWindHandle(string aProcName)
{
IntPtr lProcNameHandle = IntPtr.Zero;
Process[] processes = Process.GetProcessesByName(aProcName);

if (processes.Length > 0)
if (processes[0].Threads.Count > 0)
lProcNameHandle = processes[0].Handle;

return lProcNameHandle;

}

private IntPtr FindWindThreadIDByGetWindowThreadProcessId()
{
return GetWindowThreadProcessId(GetOutlookThread(), IntPtr.Zero);

}

private IntPtr GetOutlookThread()
{
IntPtr myWindow = IntPtr.Zero;
Process[] processes = Process.GetProcessesByName("Outlook" );
foreach (Process p in processes)
{
myWindow = p.MainWindowHandle;
}
return myWindow;
}


public void SetHook()
{
IntPtr hook1 = SetWindowsHookEx(HookType.WH_GETMESSAGE, myGetAllMsg, IntPtr.Zero, AppDomain.GetCurrentThreadId()); // hook1 a une valeur mais ne capture pas les messages
IntPtr outlookThreadId = FindWindThreadIDByGetWindowThreadProcessId(); // me retourne le threadid dans lequel roule Outlook
HookProc myGetAllMsg = new HookProc(GetAllMsg);
IntPtr hook2 = SetWindowsHookEx(HookType.WH_GETMESSAGE, myGetAllMsg, IntPtr.Zero, (Int32)outlookThreadId); // Je tente de faire le hook sur le threadID de outlook, mais Hook2 a la valeur 0, cela veut dire que le hook n'a pas marché
IntPtr hook3 = SetWindowsHookEx(HookType.WH_GETMESSAGE, myGetAllMsg, FindWindHandle("Outlook" ), 0); // Je tente de faire le hook sur le handle de outlook, Hook3 a aussi le valeur 0
}

Je ne comprends pas pkoi quand j'utlise AppDomain.GetCurrentThreadId le hook a une valeur mais qd je considère le threadId dans le process Outook roule(j'espère que j'ai le bon threadID)
Voilà en gros. Votre aide me sera le bienvenu pour m'éclaircir dans cette gymnastique cérébrale du HOOK.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
14 sept. 2008 à 10:15
Hi,
Je ne sais pas, mais le code de GetOutlookThread me paraît quelques peu étrange après un rapide coup d'oeil. Seul le dernier IntPtr de la liste de process sera retourné, non?
0
AlexBob789 Messages postés 8 Date d'inscription mardi 2 mars 2004 Statut Membre Dernière intervention 14 septembre 2008
14 sept. 2008 à 15:30
Tu as raison, mais en faite tu ne peux avoir q'une seule instance de Outlook d'ouvert et dans ce cas c'est l'unique handle de Outlook qui sera retourné, d'où je n'avais pas besoin de l'avoir dans un foreach.

Merci
0
Rejoignez-nous