예제 #1
0
 /// <param name="nCode">A code that uses to determine how to process the message.</param>
 /// <param name="wParam">The identifier of the mouse message.</param>
 /// <param name="lParam">A pointer to an MSLLHOOKSTRUCT structure.</param>
 /// <returns></returns>
 public override FilterResult msg(int nCode, WPARAM wParam, LPARAM lParam)
 {
     if (SysMessages.Eq(wParam, SysMessages.WM_MOUSEMOVE))
     {
         return(FilterResult.IgnoreFilters);
     }
     return(FilterResult.Continue);
 }
예제 #2
0
 private void sendCode(TCode cmd)
 {
     if(SysMessages.Eq(cmd.wParam, CodeDown)) {
         sendCodeDown();
     }
     else if(SysMessages.Eq(cmd.wParam, CodeUp)) {
         sendCodeUp();
     }
 }
예제 #3
0
 public bool isFlag(MouseState.Flags flags, WPARAM wParam, uint code1, uint code2)
 {
     if ((listener.Handler & flags) != 0 &&
         (SysMessages.EqOr(wParam, code1, code2)))
     {
         return(true);
     }
     return(false);
 }
예제 #4
0
 protected bool isLMR(WPARAM wParam)
 {
     if (SysMessages.EqOr(wParam,
                          SysMessages.WM_LBUTTONDOWN,
                          SysMessages.WM_LBUTTONUP,
                          SysMessages.WM_MBUTTONDOWN,
                          SysMessages.WM_MBUTTONUP,
                          SysMessages.WM_RBUTTONDOWN,
                          SysMessages.WM_RBUTTONUP))
     {
         return(true);
     }
     return(false);
 }
예제 #5
0
            public override FilterResult process(int nCode, WPARAM wParam, LPARAM lParam)
            {
                if (parent.Data == null)
                {
                    parent.Data = new TData();
                }
                var v = (TData)parent.Data;

                lock (sync)
                {
                    if (toAbortNext && SysMessages.Eq(wParam, CodeUp))
                    {
                        toAbortNext = false;
                        LSender.Send(this, $"Prevent '{wParam}' because of previous mixed code.", Message.Level.Info);
                        return(FilterResult.Abort);
                    }

                    if (isBtnDown && SysMessages.Eq(wParam, CodeDown))
                    {
                        toAbortNext = true;
                        LSender.Send(this, $"Found mixed {wParam}", Message.Level.Info);
                        parent.trigger();
                        return(FilterResult.Abort);
                    }

                    if (!v.onlyDownCodes && (isBtnUp && SysMessages.Eq(wParam, CodeUp)))
                    {
                        LSender.Send(this, $"Found mixed {wParam}", Message.Level.Info);
                        parent.trigger();
                        return(FilterResult.Abort);
                    }

                    if (SysMessages.Eq(wParam, CodeDown))
                    {
                        isBtnDown = true;
                        isBtnUp   = false;
                    }
                    else if (SysMessages.Eq(wParam, CodeUp))
                    {
                        isBtnDown = false;
                        isBtnUp   = true;
                    }

#if DEBUG
                    LSender.Send(this, $"Continue {wParam}", Message.Level.Trace);
#endif
                    return(FilterResult.Continue);
                }
            }
예제 #6
0
        /// <param name="nCode">A code that uses to determine how to process the message.</param>
        /// <param name="wParam">The identifier of the mouse message.</param>
        /// <param name="lParam">A pointer to an MSLLHOOKSTRUCT structure.</param>
        /// <returns></returns>
        public override FilterResult msg(int nCode, WPARAM wParam, LPARAM lParam)
        {
            if (SysMessages.Eq(wParam, SysMessages.WM_LBUTTONDOWN))
            {
                LSender.Send(this, $"WM_LBUTTONDOWN", Message.Level.Info);
            }
            else if (SysMessages.Eq(wParam, SysMessages.WM_LBUTTONUP))
            {
                LSender.Send(this, $"WM_LBUTTONUP", Message.Level.Info);
            }
            else if (SysMessages.Eq(wParam, SysMessages.WM_RBUTTONDOWN))
            {
                LSender.Send(this, $"WM_RBUTTONDOWN", Message.Level.Info);
            }
            else if (SysMessages.Eq(wParam, SysMessages.WM_RBUTTONUP))
            {
                LSender.Send(this, $"WM_RBUTTONUP", Message.Level.Info);
            }
            else if (SysMessages.Eq(wParam, SysMessages.WM_MBUTTONDOWN))
            {
                LSender.Send(this, $"WM_MBUTTONDOWN", Message.Level.Info);
            }
            else if (SysMessages.Eq(wParam, SysMessages.WM_MBUTTONUP))
            {
                LSender.Send(this, $"WM_MBUTTONUP", Message.Level.Info);
            }
            else if (SysMessages.Eq(wParam, SysMessages.WM_MOUSEWHEEL))
            {
                LSender.Send(this, $"WM_MOUSEWHEEL", Message.Level.Info);
            }
            else if (SysMessages.Eq(wParam, SysMessages.WM_MOUSEHWHEEL))
            {
                LSender.Send(this, $"[WM_MOUSEHWHEEL]", Message.Level.Info);
            }

            //unchecked {
            //    ++TriggerCount;
            //}

            return(FilterResult.Continue);
        }
예제 #7
0
            public override FilterResult process(int nCode, WPARAM wParam, LPARAM lParam)
            {
                lock (sync)
                {
                    var d = Delta;
                    //LSender.Send(this, $"{wParam} - delta {d}ms", Message.Level.Trace);

                    if (isPrevCodeDown && SysMessages.Eq(wParam, CodeUp))
                    {
                        isPrevCodeDown = false;
                        LSender.Send(this, $"Prevent '{wParam}' because of previous {CodeDown}", Message.Level.Debug);
                        return(FilterResult.Abort);
                    }

                    if (isPrevCodeDown && SysMessages.Eq(wParam, CodeDown))
                    {
                        isPrevCodeDown = false;
                        LSender.Send(this, $"Expected '{CodeUp}' was not found. Reset flag.", Message.Level.Debug);
                    }

                    if (SysMessages.Eq(wParam, CodeDown) && d < parent.Value)
                    {
                        LSender.Send(this, $"Found double-click bug of '{wParam}' because of delta {d}", Message.Level.Info);
                        isPrevCodeDown = true;

                        parent.trigger();
                        updateStamp();
                        return(FilterResult.Abort);
                    }

                    if (SysMessages.Eq(wParam, CodeDown))
                    {
                        updateStamp();
                    }

                    return(FilterResult.Continue);
                }
            }
예제 #8
0
        /// <param name="nCode">A code that uses to determine how to process the message.</param>
        /// <param name="wParam">The identifier of the mouse message.</param>
        /// <param name="lParam">A pointer to an MSLLHOOKSTRUCT structure.</param>
        /// <returns></returns>
        public override FilterResult msg(int nCode, WPARAM wParam, LPARAM lParam)
        {
            if (Data == null || !SysMessages.EqOr(wParam, SysMessages.WM_MOUSEWHEEL))
            {
                //TODO: SysMessages.WM_MOUSEHWHEEL
                return(FilterResult.Continue);
            }
            var llhook = getMSLLHOOKSTRUCT(lParam);

            uint delta = llhook.time - prevStamp;
            var  v     = (TData)Data;

            if (delta > v.limit)
            {
                count = 0;
            }
            else
            {
                ++count;
            }

            if (count > v.capacity)
            {
                LSender.Send(this, $"Scroll has been filtered {wParam}/{count} = {v.capacity}:{v.limit}", Message.Level.Info);
                ((IMouseListenerSvc)this).trigger();
                return(FilterResult.Abort);
            }

            //if(delta < v.acceleration && count > v.capacity) {
            //    ++accelerationCount;
            //}

            LSender.Send(this, $"MouseData: count {count} - delta {delta}", Message.Level.Trace);
            prevStamp = llhook.time;

            return(FilterResult.Continue);
        }
예제 #9
0
            public override FilterResult process(int nCode, WPARAM wParam, LPARAM lParam)
            {
                //if(shadowClick) { // now it will be processed via ReCodes + lowLevelMouseProc
                //    return FilterResult.Continue;
                //}

                if(!raisedCodeUp && SysMessages.Eq(wParam, CodeDown)) {
                    stampCodeDown = DateTime.Now;
                    return FilterResult.Continue;
                }

                if(raisedCodeUp && SysMessages.Eq(wParam, CodeUp)) {
                    return FilterResult.Continue;
                }

                var delta   = (DateTime.Now - stampCodeDown).TotalMilliseconds;
                var v       = Data;

                if((delta > v.deltaMin && delta <= v.deltaMax) && SysMessages.Eq(wParam, CodeUp)) {
                    LSender.Send(this, $"{CodeDown} <-{delta}-> {CodeUp}-{CodeDown} :: consider as a user click", Message.Level.Debug);
                    return FilterResult.Continue;
                }

                if(SysMessages.Eq(wParam, CodeUp)) {
                    raisedCodeUp = true;
                }

                buffer.Enqueue(new TCode() {
                    nCode   = nCode,
                    lParam  = lParam,
                    wParam  = wParam
                });
                LSender.Send(this, $"'{wParam}' has been buffered ({buffer.Count})", Message.Level.Trace);

                if(lockedThread) {
                    return FilterResult.Abort;
                }

                Task.Factory.StartNew(() =>
                {
                    lock(sync)
                    {
                        lockedThread = true;

                        var cmd1 = new TCode();
                        while(buffer.Count > 0)
                        {
                            if(!buffer.TryDequeue(out cmd1)) {
                                shortSleep();
                                continue;
                            }

                            if(SysMessages.Eq(cmd1.wParam, CodeUp)) {
                                // now we should look possible bug: down ... [up, down] ... up
                                waitNewCodes();
                                break;
                            }

                            if(SysMessages.Eq(cmd1.wParam, CodeDown)) {
                                sendCodeDown();
                                lockedThread = false;
                                return;
                            }
                        }

                        if(SysMessages.Eq(cmd1.wParam, 0)) {
                            raisedCodeUp = false;
                            lockedThread = false;
                            return;
                        }

                        TCode cmd2;
                        if(buffer.Count > 0)
                        {
                            while(!buffer.TryDequeue(out cmd2)) {
                                shortSleep();
                            }
                            LSender.Send(this, $"Buffer > 0 :: {cmd2.wParam}", Message.Level.Trace);
                        }
                        else {
                            cmd2 = new TCode();
                        }

                        if(SysMessages.Eq(cmd1.wParam, CodeUp)
                            && SysMessages.Eq(cmd2.wParam, CodeDown))
                        {
                            LSender.Send(this, $"Found bug with recovering of codes {CodeUp} -> {CodeDown}", Message.Level.Info);
                            parent.trigger();
                        }
                        else {
                            resend(cmd1, cmd2);
                        }

                        raisedCodeUp = false;
                        lockedThread = false;
                    }
                });

                //stamp = DateTime.Now;
                return FilterResult.Abort;
            }