private void lowLevelMouseProcHook(LowLevelMouseMessage message, MouseLowLevelHookStruct info)
        {
            Current = info.pt;

            switch (message)
            {
            case LowLevelMouseMessage.WM_LBUTTONUP:
            case LowLevelMouseMessage.WM_RBUTTONUP:
                if (MouseUp != null)
                {
                    MouseUp(this, EventArgs.Empty);
                }
                break;

            case LowLevelMouseMessage.WM_LBUTTONDOWN:
            case LowLevelMouseMessage.WM_RBUTTONDOWN:
                if (MouseDown != null)
                {
                    MouseDown(this, EventArgs.Empty);
                }
                break;

            case LowLevelMouseMessage.WM_MOUSEMOVE:
                if (MouseMove != null)
                {
                    MouseMove(this, EventArgs.Empty);
                }
                break;

            default: break;
            }
        }
예제 #2
0
        /// <summary>
        ///   Registers a low-level global mouse system hook.
        /// </summary>
        ///
        public static HookHandle SetWindowHook(LowLevelMouseProcedure callback)
        {
            IntPtr hHook;

            NativeMethods.LowLevelHookProc lpfn;

            using (Process process = Process.GetCurrentProcess())
                using (ProcessModule module = process.MainModule)
                {
                    IntPtr hModule = NativeMethods.GetModuleHandle(module.ModuleName);

                    lpfn = new NativeMethods.LowLevelHookProc((nCode, wParam, lParam) =>
                    {
                        // From
                        // http://msdn.microsoft.com/en-us/library/windows/desktop/ms644986(v=vs.85).aspx
                        //
                        // wParam contains the identifier of the mouse message.
                        // lParam contains a pointer to a MOUSEHOOKSTRUCT structure.
                        //
                        // The wParam can be can be one of the following messages: WM_LBUTTONDOWN,
                        // WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_MOUSEHWHEEL, WM_RBUTTONDOWN,
                        // or WM_RBUTTONUP.

                        if (nCode < 0)
                        {
                            return(NativeMethods.CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam));
                        }

                        MouseLowLevelHookStruct mouseInfo =
                            (MouseLowLevelHookStruct)Marshal.PtrToStructure(lParam,
                                                                            typeof(MouseLowLevelHookStruct));

                        callback((LowLevelMouseMessage)(wParam.ToInt32()), mouseInfo);

                        return(NativeMethods.CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam));
                    });

                    hHook = NativeMethods.SetWindowsHookEx(
                        NativeMethods.HookType.WH_MOUSE_LL, lpfn, hModule, 0);
                }

            return(new HookHandle(hHook, lpfn));
        }
예제 #3
0
        private void lowLevelMouseProcHook(LowLevelMouseMessage message, MouseLowLevelHookStruct info)
        {
            Current = info.pt;

            switch (message)
            {
                case LowLevelMouseMessage.WM_LBUTTONUP:
                case LowLevelMouseMessage.WM_RBUTTONUP:
                    if (MouseUp != null) MouseUp(this, EventArgs.Empty);
                    break;

                case LowLevelMouseMessage.WM_LBUTTONDOWN:
                case LowLevelMouseMessage.WM_RBUTTONDOWN:
                    if (MouseDown != null) MouseDown(this, EventArgs.Empty);
                    break;

                case LowLevelMouseMessage.WM_MOUSEMOVE:
                    if (MouseMove != null) MouseMove(this, EventArgs.Empty);
                    break;

                default: break;
            }
        }