public Callbacks(OnMouseLocationSelected c, Action <int, int> u) { callback = c; update = u; }
private void selectDelegate(OnMouseLocationSelected callback, Action <int, int> update) { show(MyColors.BLUE); Action loop = null; object syncLock = new object(); bool followMouse = true; Hook.OnMouseDelegate mouseDown = null; mouseDown = (ma, x, y) => { if (ma != MouseAction.WM_LBUTTONDOWN) { return; } lock (syncLock) { followMouse = false; } hide(); System.Drawing.Point p = CursorMonitor.Position(); Hook.I().RemoveMouseHook(mouseDown).ContinueWith((t) => { loop = () => { }; callback(p.X, p.Y); }); }; Hook.I().AddMouseHook(mouseDown); Hook.OnKeyDelegate keyU = (k) => { }; Hook.OnKeyDelegate keyD = null; keyD = (k) => { if (k != Key.Escape) { return; } lock (syncLock) { followMouse = false; } Dispatcher.Invoke(() => { WindowState = WindowState.Minimized; Visibility = Visibility.Hidden; }); Hook.I().RemoveKeyHook(keyD, keyU).ContinueWith((t) => { return(Hook.I().RemoveMouseHook(mouseDown)); }).ContinueWith((t) => { callback(0, 0, true); }); }; Hook.I().AddKeyHook(keyD, keyU); TextBlock coords = new TextBlock(); coords.Foreground = new SolidColorBrush(Colors.Black); coords.Background = new SolidColorBrush(Colors.White); coords.Padding = new Thickness(4); loop = () => { Topmost = true; canvas.Children.Clear(); System.Drawing.Point p = CursorMonitor.Position(); p.X = p.X == 0 ? 0 : p.X - 2; p.Y = p.Y == 0 ? 0 : p.Y - 2; update(p.X, p.Y); Line h = new Line(); h.Stroke = new SolidColorBrush(BLUE); h.StrokeThickness = 2; h.X1 = 0; h.X2 = W; h.Y1 = p.Y; h.Y2 = p.Y; Line v = new Line(); v.Stroke = new SolidColorBrush(BLUE); v.StrokeThickness = 2; v.X1 = p.X; v.X2 = p.X; v.Y1 = 0; v.Y2 = H; coords.Text = p.X + ", " + p.Y; double fac = 15; double coordX = W - p.X < coords.ActualWidth + fac ? W - (coords.ActualWidth + fac) : p.X + 4; double coordY = p.Y < coords.ActualHeight + fac ? coords.ActualHeight + fac : p.Y; Canvas.SetLeft(coords, coordX); Canvas.SetBottom(coords, H - coordY); canvas.Children.Add(h); canvas.Children.Add(v); canvas.Children.Add(coords); //return; lock (syncLock) { if (!followMouse) { return; } } Task.Delay(16).ContinueWith((t) => { Dispatcher.Invoke(() => { loop(); }); }); }; Dispatcher.Invoke(loop); }