LRESULT CALLBACK CbtHookCallback(int code, WPARAM wparam, LPARAM lparam)
{
if (code >= 0)
fCallback(code);
return CallNextHookEx(hookCbt, code, wparam, lparam); // Rappel du hook
}
Et le code C# de la form :
Code :
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Test
{
public enum WH_CBT : int
{
WH_CBT_MOVESIZE = 0,
WH_CBT_MINMAX,
WH_CBT_QS,
WH_CBT_CREATEWND,
WH_CBT_DESTROYWND,
WH_CBT_ACTIVATE,
WH_CBT_CLICKSKIPPED,
WH_CBT_KEYSKIPPED,
WH_CBT_SYSCOMMAND,
WH_CBT_SETFOCUS
}
public partial class Form1 : Form
{
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void OnHookCbtEvent(int code);
public Form1()
{
InitializeComponent();
this.onCbt = new OnHookCbtEvent(OnCbtDelegate);
Init(onCbt);
}
public void OnCbtDelegate(int code)
{
listBox1.Items.Add(Enum.GetName(typeof(WH_CBT), (WH_CBT)code));
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Uninit();
}
}
}
Le probleme est qu'a l'exécution le code fonctionne mais pas longtemps, au bout d'un moment le callback n'est plus appellé. Auriez vous une idée ?
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 17 déc. 2009 à 11:39
Salut, oui c'est classique, ton délégué a été rammassé par le GC. Tu dois le protèger en le gardant en membre de la classe, en C++/CLI il est même conseillé de l'allouer dans un GCHandle mais en C# ça me semble inutile.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 17 déc. 2009 à 11:49
En fait je vois que tu l'as déja gardé en champ de ta classe .. Es tu sûr de la convention d'appel Cdecl de ton callback et Le MarshalAs(UnmanagedType.FunctionPtr) me surprend, moi je ne l'aurais pas mis.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 17 déc. 2009 à 14:40
As tu retiré le [MarshalAs(UnmanagedType.FunctionPtr)] de la fonction Init, c'est celui qui me gêne le plus. La définition C++ de HOOKPROC est en __stdcall donc change l'attribut UnmanagedFunctionPointer.
Si ça plante encore test le GCHandle. ( l'exemple est en C++/CLI )