Beispiel #1
0
        public static void Check()
        {
            //explorer 进程已死
            if (ExploreProcess == null || ExploreProcess.HasExited)
            {
                ExploreProcess   = GetExplorer();
                _lastTriggerTime = DateTime.Now;
            }

            if (_lastTriggerTime != null)
            {
                var workw = WallpaperHelper.GetWorkerW();
                if (workw != IntPtr.Zero)
                {
                    ExplorerCreated?.Invoke(null, new EventArgs());
                    _lastTriggerTime = null;
                }
            }
        }
        private static void Start()
        {
            if (started)
            {
                return;
            }

            mouseWatcher = eventHookFactory.GetMouseWatcher();
            mouseWatcher.Start();
            mouseWatcher.OnMouseInput += (s, e) =>
            {
                if (SendInterval > 0)
                {
                    if (DateTime.Now < _nextSendTime)
                    {
                        return;
                    }

                    _nextSendTime = DateTime.Now + TimeSpan.FromMilliseconds(SendInterval);
                }

                //cef收到鼠标事件后会自动active,看有办法规避不
                //点击等事件只在桌面触发,否则可能导致窗口胡乱激活
                if (!WallpaperHelper.IsDesktop() && e.Message != MouseMessages.WM_MOUSEMOVE)
                {
                    return;
                }

                //MouseMessages[] supportMessage = new MouseMessages[] { MouseMessages.WM_MOUSEMOVE, MouseMessages.WM_LBUTTONDOWN, MouseMessages.WM_LBUTTONUP };
                //MouseMessages[] supportMessage = new MouseMessages[] { MouseMessages.WM_MOUSEMOVE };

                //if (!supportMessage.Contains(e.Message))
                //    return;

                int x = e.Point.x;
                int y = e.Point.y;
                var currentDisplay = Screen.FromPoint(new System.Drawing.Point(x, y));

                if (x < 0)
                {
                    x = SystemInformation.VirtualScreen.Width + x - Screen.PrimaryScreen.Bounds.Width;
                }
                else
                {
                    x -= Math.Abs(currentDisplay.Bounds.X);
                }

                if (y < 0)
                {
                    y = SystemInformation.VirtualScreen.Height + y - Screen.PrimaryScreen.Bounds.Height;
                }
                else
                {
                    y -= Math.Abs(currentDisplay.Bounds.Y);
                }

                // 根据官网文档中定义,lParam低16位存储鼠标的x坐标,高16位存储y坐标
                int lParam = y;
                lParam <<= 16;
                lParam  |= x;
                // 发送消息给目标窗口

                IntPtr wParam = (IntPtr)0x0020;

                foreach (var window in _targetWindows)
                {
                    if (window.Screen != currentDisplay.DeviceName)
                    {
                        continue;
                    }

                    User32Wrapper.PostMessageW(window.Handle, (uint)e.Message, wParam, (IntPtr)lParam);
                }

                //System.Diagnostics.Debug.WriteLine("Mouse event {0} --000-- {1},{2}", e.Message.ToString(), e.Point.x, e.Point.y);
                //System.Diagnostics.Debug.WriteLine("Mouse event {0} {1},{2}", e.Message.ToString(), x, y);
            };

            started = true;
        }