using DamnOverSharp.Helpers; using DamnOverSharp.WPF.UiLibrary; using Gma.System.MouseKeyHook; using System.Diagnostics; using System.Linq; using System.Windows; using System.Windows.Forms; using System.Windows.Input; namespace DamnOverSharp.Renderers.WPF { internal class WpfInteractionManager { private WpfRenderer Owner; private IKeyboardMouseEvents GlobalMouseHook; public Point Offset = new Point(0, 0); public static bool IsShiftDown { get; private set; } = false; public static bool IsControlDown { get; private set; } = false; public static bool IsAltDown { get; private set; } = false; public VirtualControlBase FocusedElement { get; private set; } = null; internal WpfInteractionManager(WpfRenderer owner) { Owner = owner; GlobalMouseHook = Hook.GlobalEvents(); GlobalMouseHook.MouseDownExt += GlobalMouseDown; GlobalMouseHook.MouseUpExt += GlobalMouseUp; GlobalMouseHook.MouseMoveExt += GlobalMouseMove; GlobalMouseHook.KeyDown += GlobalKeyDown; GlobalMouseHook.KeyUp += GlobalKeyUp; } private void GlobalKeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { Rect windowRect = WindowHelper.GetWindowRectangle(Owner.InternalBitmapRenderer.HookedProcess.MainWindowHandle); Point cursorPos = MouseHelper.GetCursorPosition(); if (windowRect.Contains(cursorPos)) { //e.Handled = true; switch (e.KeyCode) { case Keys.LShiftKey: case Keys.RShiftKey: IsShiftDown = true; break; case Keys.LControlKey: case Keys.RControlKey: IsControlDown = true; break; case Keys.Alt: IsAltDown = true; break; } FocusedElement.OnVirtualKeyDown(e.KeyCode); } } private void GlobalKeyUp(object sender, System.Windows.Forms.KeyEventArgs e) { Rect windowRect = WindowHelper.GetWindowRectangle(Owner.InternalBitmapRenderer.HookedProcess.MainWindowHandle); Point cursorPos = MouseHelper.GetCursorPosition(); if (windowRect.Contains(cursorPos)) { //e.Handled = true; switch (e.KeyCode) { case Keys.LShiftKey: case Keys.RShiftKey: IsShiftDown = false; break; case Keys.LControlKey: case Keys.RControlKey: IsControlDown = false; break; case Keys.Alt: IsAltDown = false; break; } FocusedElement.OnVirtualKeyUp(e.KeyCode); } } private void GlobalMouseMove(object sender, MouseEventExtArgs e) { Rect windowRect = WindowHelper.GetWindowRectangle(Owner.InternalBitmapRenderer.HookedProcess.MainWindowHandle); Point cursorPos = MouseHelper.GetCursorPosition(); if (windowRect.Contains(MouseHelper.GetCursorPosition())) { Point relativeCursorPos = new Point(cursorPos.X - windowRect.X - Offset.X, cursorPos.Y - windowRect.Y - Offset.Y); foreach (VirtualControlBase child in WPF_VisualHelper.GetAllChildren(Owner.MainContentGrid).OfType()) { if (!child.IsHitTestVisible || child.Visibility != Visibility.Visible || child.Opacity <= 0) { continue; } if (WPF_VisualHelper.GetVisualRect(child, Owner.ViewBox).Contains(relativeCursorPos)) { if (!child.VirtualMouseOver) { child.VirtualMouseOver = true; child.OnVirtualMouseEnter(); } } else { if (child.VirtualMouseOver) { child.VirtualMouseOver = false; child.OnVirtualMouseLeave(); } } child.OnVirtualMouseMove(relativeCursorPos); } } } private void GlobalMouseDown(object sender, MouseEventExtArgs e) { Rect windowRect = WindowHelper.GetWindowRectangle(Owner.InternalBitmapRenderer.HookedProcess.MainWindowHandle); Point cursorPos = MouseHelper.GetCursorPosition(); if (windowRect.Contains(cursorPos)) { Point relativeCursorPos = new Point(cursorPos.X - windowRect.X - Offset.X, cursorPos.Y - windowRect.Y - Offset.Y); foreach (FrameworkElement child in WPF_VisualHelper.GetAllChildren(Owner.MainContentGrid).OfType()) { if (!child.IsHitTestVisible || child.Visibility != Visibility.Visible || child.Opacity <= 0) { continue; } if (WPF_VisualHelper.GetVisualRect(child, Owner.ViewBox).Contains(relativeCursorPos)) { e.Handled = true; if (child is VirtualControlBase) { if((child as VirtualControlBase).OnVirtualMouseDown()) { if(FocusedElement != (child as VirtualControlBase)) { if (FocusedElement != null) { FocusedElement.VirtualFocused = false; FocusedElement.OnLostVirtualFocus(); } FocusedElement = (child as VirtualControlBase); FocusedElement.VirtualFocused = true; FocusedElement.OnGotVirtualFocus(); Owner.UpdateVisual(); } (child as VirtualControlBase).VirtualMouseDown = true; break; } } } } } } private void GlobalMouseUp(object sender, MouseEventExtArgs e) { Rect windowRect = WindowHelper.GetWindowRectangle(Owner.InternalBitmapRenderer.HookedProcess.MainWindowHandle); Point cursorPos = MouseHelper.GetCursorPosition(); if (windowRect.Contains(cursorPos)) { Point relativeCursorPos = new Point(cursorPos.X - windowRect.X - Offset.X, cursorPos.Y - windowRect.Y - Offset.Y); foreach (FrameworkElement child in WPF_VisualHelper.GetAllChildren(Owner.MainContentGrid).OfType()) { if (!child.IsHitTestVisible || child.Visibility != Visibility.Visible || child.Opacity <= 0) { continue; } if (WPF_VisualHelper.GetVisualRect(child, Owner.ViewBox).Contains(relativeCursorPos)) { e.Handled = true; if (child is VirtualControlBase) { if ((child as VirtualControlBase).OnVirtualMouseUp()) { (child as VirtualControlBase).VirtualMouseDown = false; break; } } } } } } public void Destroy() { GlobalMouseHook.MouseDownExt -= GlobalMouseDown; GlobalMouseHook.MouseUpExt -= GlobalMouseUp; GlobalMouseHook.MouseMoveExt -= GlobalMouseMove; GlobalMouseHook.Dispose(); } } }