Пример #1
0
 int INativeKeyboard.CallNextHookEx(IntPtr hhk,
                                    int nCode,
                                    GlobalHook.MessageType wParam,
                                    [In] INativeKeyboard.KBDLLHOOKSTRUCT lParam)
 {
     return(CallNextHookEx(hhk, nCode, wParam, lParam));
 }
Пример #2
0
        public void TestGlobalHook_AddListener()
        {
            /* PRECONDITIONS */
            Debug.Assert(hookNativeMethods != null);
            Debug.Assert(hookNativeMethods.Mock != null);

            /* GIVEN */
            const int numOfEvent    = 50;
            const int numOfNotEvent = 20;
            const GlobalHook.MessageType messageType = GlobalHook.MessageType.WM_USER;

            using var resetCounter = new CountdownEvent(numOfEvent);
            using var autoReset    = new AutoResetEvent(false);

            GlobalHook.CppGetMessageCallback callback = null;

            hookNativeMethods.AllowMessageTypeRegistry(messageType);
            hookNativeMethods.AllowLibraryLoad();
            hookNativeMethods.Mock
            .Setup(hook => hook.SetHook(It.IsAny <GlobalHook.CppGetMessageCallback>(), It.IsAny <bool>()))?
            .Callback((GlobalHook.CppGetMessageCallback cppCallback, bool isBlocking) =>
            {
                callback = cppCallback;
                autoReset.Set();
            });

            /* WHEN */
            GlobalHook.AddListener(message =>
            {
                Assert.AreEqual((uint)messageType, message.Type);
                resetCounter.Signal();
            }, messageType);

            GlobalHook.IsActive = true;

            Assert.IsTrue(autoReset.WaitOne(maxWaitTime));
            Assert.IsNotNull(callback);

            for (var index = 0; index < numOfEvent; index++)
            {
                callback(new GlobalHook.HookMessage()
                {
                    Type = (uint)messageType
                });
            }

            // We check if our listener still gets called on events we don't care about. If it will this
            // test will throw because the resetCounter will be set to a negative number.
            for (var index = 0; index < numOfNotEvent; index++)
            {
                callback(new GlobalHook.HookMessage()
                {
                    Type = (uint)GlobalHook.MessageType.WM_APP
                });
            }

            /* THEN */
            Assert.IsTrue(resetCounter.Wait(maxWaitTime));
        }
Пример #3
0
        public void TestGlobalHook_AddListener_UnsupportedMessageType()
        {
            /* PRECONDITIONS */
            Debug.Assert(hookNativeMethods != null);
            Debug.Assert(hookNativeMethods.Mock != null);

            /* GIVEN */
            const GlobalHook.MessageType messageType = GlobalHook.MessageType.WM_USER;

            hookNativeMethods.DisallowMessageTypeRegistry(messageType);

            /* WHEN */
            Assert.ThrowsException <NotSupportedException>(() => GlobalHook.AddListener(message => { }, messageType));

            /* THEN */
            hookNativeMethods.Mock.Verify(hook => hook.SetHook(It.IsAny <GlobalHook.CppGetMessageCallback>(), It.IsAny <bool>()), Times.Never);
        }
Пример #4
0
 private MouseAction GetMouseAction(GlobalHook.MessageType messageType)
 {
     return(messageType switch
     {
         GlobalHook.MessageType.WM_RBUTTONDOWN => MouseAction.RightClick,
         GlobalHook.MessageType.WM_NCRBUTTONDOWN => MouseAction.RightClick,
         GlobalHook.MessageType.WM_LBUTTONDOWN => MouseAction.LeftClick,
         GlobalHook.MessageType.WM_NCLBUTTONDOWN => MouseAction.LeftClick,
         GlobalHook.MessageType.WM_MBUTTONDOWN => MouseAction.MiddleClick,
         GlobalHook.MessageType.WM_NCMBUTTONDOWN => MouseAction.MiddleClick,
         GlobalHook.MessageType.WM_RBUTTONDBLCLK => MouseAction.RightDoubleClick,
         GlobalHook.MessageType.WM_NCRBUTTONDBLCLK => MouseAction.RightDoubleClick,
         GlobalHook.MessageType.WM_LBUTTONDBLCLK => MouseAction.LeftDoubleClick,
         GlobalHook.MessageType.WM_NCLBUTTONDBLCLK => MouseAction.LeftDoubleClick,
         GlobalHook.MessageType.WM_MBUTTONDBLCLK => MouseAction.MiddleDoubleClick,
         GlobalHook.MessageType.WM_NCMBUTTONDBLCLK => MouseAction.MiddleDoubleClick,
         _ => MouseAction.None
     });
Пример #5
0
        public void TestGlobalHook_RemoveListener()
        {
            /* PRECONDITIONS */
            Debug.Assert(hookNativeMethods != null);
            Debug.Assert(hookNativeMethods.Mock != null);

            /* GIVEN */
            const GlobalHook.MessageType messageType = GlobalHook.MessageType.WM_USER;

            using var autoReset = new AutoResetEvent(false);

            GlobalHook.CppGetMessageCallback callback = null;

            hookNativeMethods.AllowMessageTypeRegistry(messageType);
            hookNativeMethods.AllowLibraryLoad();

            hookNativeMethods.Mock
            .Setup(hook => hook.SetHook(It.IsAny <GlobalHook.CppGetMessageCallback>(), It.IsAny <bool>()))?
            .Callback((GlobalHook.CppGetMessageCallback cppCallback, bool isBlocking) =>
            {
                callback = cppCallback;
                autoReset.Set();
            });
Пример #6
0
 public void DisallowMessageTypeRegistry(GlobalHook.MessageType messageType)
 {
     Mock?
     .Setup(hook => hook.Capture((uint)messageType))?
     .Returns(false);
 }
Пример #7
0
 private static extern int CallNextHookEx(IntPtr hhk,
                                          int nCode,
                                          GlobalHook.MessageType wParam,
                                          [In] INativeKeyboard.KBDLLHOOKSTRUCT lParam);