namespace Bemo
open System
open System.Runtime.InteropServices
type InputManagerPlugin(msgSet:Set2<Int32>) as this =
let hookProcDelegate = HOOKPROC(this.llHook)
let mutable kbHook = null
let OS = OS()
member this.desktop = Services.desktop
member this.foregroundGroup = Services.desktop.foregroundGroup
member this.llHook nCode (wParam:IntPtr) lParam =
let msg = wParam.ToInt32()
if msgSet.contains(msg) then
this.foregroundGroup.iter <| fun group ->
let hookStruct = unbox<MSLLHOOKSTRUCT>(Marshal.PtrToStructure(lParam, typeof<MSLLHOOKSTRUCT>))
let pt = hookStruct.pt.Pt
let data = hookStruct.mouseData.IntPtr
let groupInfo = group.cast<GroupInfo>()
groupInfo.invokeGroup <| fun() ->
groupInfo.group.postMouseLL(msg, pt, data)
WinUserApi.CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)
member this.registerMouseLLHook() =
WinUserApi.SetWindowsHookEx(WindowHookTypes.WH_MOUSE_LL, hookProcDelegate, IntPtr.Zero, 0).ignore
member this.registerKeyboardLLHook() =
kbHook <- OS.registerKeyboardLLHook <| fun(key, data) ->
this.foregroundGroup.iter <| fun group ->
let groupInfo = group.cast<GroupInfo>()
groupInfo.invokeGroup <| fun() ->
groupInfo.group.postKeyboardLL(int(key), data)
None
interface IPlugin with
member x.init() =
this.registerMouseLLHook()
this.registerKeyboardLLHook()