IEがフォーカスを取得したときに追跡できるようにフックを設定するC#BHOがあります。
public class BHO : IObjectWithSite, IOleCommandTarget
{
delegate void WinEventDelegate(IntPtr hWinEventHook,
uint eventType, IntPtr hwnd, int idObject,
int idChild, uint dwEventThread, uint dwmsEventTime);
const uint WINEVENT_OUTOFCONTEXT = 0;
const uint EVENT_SYSTEM_FOREGROUND = 3;
[DllImport("user32.dll")]
static extern bool UnhookWinEvent(IntPtr hWinEventHook);
[DllImport("user32.dll")]
static extern IntPtr SetWinEventHook(uint eventMin,
uint eventMax, IntPtr hmodWinEventProc,
WinEventDelegate lpfnWinEventProc, uint idProcess,
uint idThread, uint dwFlags);
private static IntPtr m_hhook;
............
m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND,
EVENT_SYSTEM_FOREGROUND, IntPtr.Zero,
WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);
............
void WinEventProc(IntPtr hWinEventHook, uint eventType,
IntPtr hwnd, int idObject, int idChild,
uint dwEventThread, uint dwmsEventTime)
{
}
しばらく動作すると、IEが「保護されたメモリの読み取りまたは書き込みを試みました。これは他のメモリが破損していることを示していることがよくあります」とクラッシュします。
WinEventProcに何もない場合でもクラッシュすることに注意してください(上記のように)。フックを設定しないと、クラッシュすることはありません。
何か案は?