private async Task InvokeNextEventTriggerAsync(BaseContentView view, EventTriggerModel model, CancellationToken token) { if (token.IsCancellationRequested) { return; } var processConfigModel = new ProcessConfigModel() { ItemDelay = _config.ItemDelay, SearchImageResultDisplay = _config.SearchImageResultDisplay, Processes = new List <Process>(), Token = token, Similarity = _config.Similarity, }; Dispatcher.Invoke(() => { if (_fixProcess.HasValue) { processConfigModel.Processes.Add(_fixProcess.Value.Value); } else { processConfigModel.Processes.AddRange(_processes.Where(r => r.Key.Equals(model.ProcessInfo.ProcessName)).Select(r => r.Value)); } }); var nextItem = await view.InvokeNextEventTriggerAsync(model, processConfigModel); if (nextItem != null) { await _taskQueue.Enqueue(async() => await InvokeNextEventTriggerAsync(view, nextItem, token)); } }
private void LoadConfig() { ConfigManager.Instance.LoadConfig(); ProcessConfigs.Clear(); foreach (var pc in ConfigManager.Instance.Config.ProcessConfigs) { var model = new ProcessConfigModel(); model.InjectFrom(pc); ProcessConfigs.Add(model); } }
public override async Task <IBaseEventTriggerModel> InvokeNextEventTriggerAsync(IBaseEventTriggerModel saveModel, ProcessConfigModel processEventTriggerModel) { if (processEventTriggerModel.Token.IsCancellationRequested) { return(null); } var nextModel = await TriggerProcess(saveModel as EventTriggerModel, processEventTriggerModel); return(nextModel.Item2); }
public abstract Task <IBaseEventTriggerModel> InvokeNextEventTriggerAsync(IBaseEventTriggerModel saveModel, ProcessConfigModel processEventTriggerModel);
private void SameImageMouseDragTriggerProcess(IntPtr hWnd, Point start, Point arrive, IBaseEventTriggerModel model, Tuple <float, float> factor, ProcessConfigModel config) { LogHelper.Debug($">>>>Same Drag Mouse Start Target X : { arrive.X } Target Y : { arrive.Y }"); var interval = 3; var middlePoints = this.GetIntevalDragMiddlePoint(start, arrive, interval); NativeHelper.PostMessage(hWnd, WindowMessage.LButtonDown, 1, start.ToLParam()); Task.Delay(10).Wait(); Point mousePosition; for (int i = 0; i < middlePoints.Count; ++i) { mousePosition = new Point() { X = Math.Abs(model.ProcessInfo.Position.Left + middlePoints[i].X * -1) * factor.Item1, Y = Math.Abs(model.ProcessInfo.Position.Top + middlePoints[i].Y * -1) * factor.Item2 }; LogHelper.Debug($">>>>Same Drag Move Mouse Target X : { mousePosition.X } Target Y : { mousePosition.Y }"); NativeHelper.PostMessage(hWnd, WindowMessage.MouseMove, 1, mousePosition.ToLParam()); Task.Delay(config.DragDelay).Wait(); } mousePosition = new Point() { X = Math.Abs(model.ProcessInfo.Position.Left + arrive.X * -1) * factor.Item1, Y = Math.Abs(model.ProcessInfo.Position.Top + arrive.Y * -1) * factor.Item2 }; NativeHelper.PostMessage(hWnd, WindowMessage.MouseMove, 1, mousePosition.ToLParam()); Task.Delay(10).Wait(); NativeHelper.PostMessage(hWnd, WindowMessage.LButtonUp, 0, mousePosition.ToLParam()); LogHelper.Debug($">>>>Same Drag End Mouse Target X : { mousePosition.X } Target Y : { mousePosition.Y }"); }
public async Task <Tuple <bool, IBaseEventTriggerModel> > TriggerProcess <T>(T model, ProcessConfigModel processConfigModel) where T : BaseEventTriggerModel <T> { var isExcute = false; var hWnd = IntPtr.Zero; var applciationData = ObjectExtensions.GetInstance <ApplicationDataManager>().Find(model.ProcessInfo.ProcessName) ?? new ApplicationDataModel(); for (int i = 0; i < processConfigModel.Processes.Count; ++i) { var factor = CalculateFactor(processConfigModel.Processes[i].MainWindowHandle, model, applciationData.IsDynamic); if (string.IsNullOrEmpty(applciationData.HandleName)) { hWnd = processConfigModel.Processes[i].MainWindowHandle; } else { var item = NativeHelper.GetChildHandles(processConfigModel.Processes[i].MainWindowHandle).Where(r => r.Item1.Equals(applciationData.HandleName)).FirstOrDefault(); if (item != null) { hWnd = item.Item2; } else { hWnd = processConfigModel.Processes[i].MainWindowHandle; } } if (model.RepeatInfo.RepeatType == RepeatType.Search && model.SubEventTriggers.Count > 0) { var count = model.RepeatInfo.Count; while (DisplayHelper.ProcessCapture(processConfigModel.Processes[i], out Bitmap bmp, applciationData.IsDynamic) && count-- > 0) { var targetBmp = model.Image.Resize((int)Math.Truncate(model.Image.Width * factor.Item1.Item1), (int)Math.Truncate(model.Image.Height * factor.Item1.Item1)); var similarity = OpenCVHelper.Search(bmp, targetBmp, out Point location, processConfigModel.SearchImageResultDisplay); LogHelper.Debug($"RepeatType[Search : {count}] : >>>> Similarity : {similarity} % max Loc : X : {location.X} Y: {location.Y}"); this.baseContentView.CaptureImage(bmp); if (!await TaskHelper.TokenCheckDelayAsync(model.AfterDelay, processConfigModel.Token) || similarity > processConfigModel.Similarity) { break; } for (int ii = 0; ii < model.SubEventTriggers.Count; ++ii) { await TriggerProcess(model.SubEventTriggers[ii], processConfigModel); if (processConfigModel.Token.IsCancellationRequested) { break; } } factor = CalculateFactor(processConfigModel.Processes[i].MainWindowHandle, model, applciationData.IsDynamic); } } else { var targetBmp = model.Image.Resize((int)Math.Truncate(model.Image.Width * factor.Item1.Item1), (int)Math.Truncate(model.Image.Height * factor.Item1.Item2)); if (model.SameImageDrag == true) { if (DisplayHelper.ProcessCapture(processConfigModel.Processes[i], out Bitmap bmp, applciationData.IsDynamic)) { //Todo for (int ii = 0; ii < model.MaxSameImageCount; ++ii) { var locations = OpenCVHelper.MultipleSearch(bmp, targetBmp, processConfigModel.Similarity, 2, processConfigModel.SearchImageResultDisplay); if (locations.Count > 1) { this.baseContentView.CaptureImage(bmp); var startPoint = new Point(locations[0].X + targetBmp.Width / 2, locations[0].Y + targetBmp.Height / 2); startPoint.X += this.GetRandomValue(0, targetBmp.Width / 2); startPoint.Y += this.GetRandomValue(0, targetBmp.Height / 2); var endPoint = new Point(locations[1].X + targetBmp.Width / 2, locations[1].Y + targetBmp.Width / 2); endPoint.X += this.GetRandomValue(0, targetBmp.Width / 2); endPoint.Y += this.GetRandomValue(0, targetBmp.Height / 2); SameImageMouseDragTriggerProcess(hWnd, startPoint, endPoint, model, factor.Item2, processConfigModel); } else { break; } } } } else if (DisplayHelper.ProcessCapture(processConfigModel.Processes[i], out Bitmap bmp, applciationData.IsDynamic)) { var similarity = OpenCVHelper.Search(bmp, targetBmp, out Point location, processConfigModel.SearchImageResultDisplay); LogHelper.Debug($"Similarity : {similarity} % max Loc : X : {location.X} Y: {location.Y}"); if (model.SameImageDrag == false) { this.baseContentView.CaptureImage(bmp); } if (similarity > processConfigModel.Similarity) { if (model.SubEventTriggers.Count > 0) { if (model.RepeatInfo.RepeatType == RepeatType.Count || model.RepeatInfo.RepeatType == RepeatType.Once) { for (int ii = 0; ii < model.RepeatInfo.Count; ++ii) { if (!await TaskHelper.TokenCheckDelayAsync(model.AfterDelay, processConfigModel.Token)) { break; } for (int iii = 0; iii < model.SubEventTriggers.Count; ++iii) { await TriggerProcess(model.SubEventTriggers[iii], processConfigModel); if (processConfigModel.Token.IsCancellationRequested) { break; } } } } else if (model.RepeatInfo.RepeatType == RepeatType.NoSearch) { while (await TaskHelper.TokenCheckDelayAsync(model.AfterDelay, processConfigModel.Token)) { isExcute = false; for (int ii = 0; ii < model.SubEventTriggers.Count; ++ii) { var childResult = await TriggerProcess(model.SubEventTriggers[ii], processConfigModel); if (processConfigModel.Token.IsCancellationRequested) { break; } if (isExcute == false && childResult.Item1) { isExcute = childResult.Item1; } } if (!isExcute) { break; } } } } else { isExcute = true; if (model.EventType == EventType.Mouse) { location.X = applciationData.OffsetX; location.Y = applciationData.OffsetY; MouseTriggerProcess(hWnd, location, model, factor.Item2, processConfigModel); } else if (model.EventType == EventType.Image) { var percentageX = _random.NextDouble(); var percentageY = _random.NextDouble(); location.X = ((location.X + applciationData.OffsetX) / factor.Item2.Item1) + (targetBmp.Width / factor.Item2.Item1 * percentageX); location.Y = ((location.Y + applciationData.OffsetY) / factor.Item2.Item2) + (targetBmp.Height / factor.Item2.Item1 * percentageY); ImageTriggerProcess(hWnd, location, model); } else if (model.EventType == EventType.RelativeToImage) { location.X = ((location.X + applciationData.OffsetX) / factor.Item2.Item1) + (targetBmp.Width / factor.Item2.Item1 / 2); location.Y = ((location.Y + applciationData.OffsetY) / factor.Item2.Item2) + (targetBmp.Height / factor.Item2.Item2 / 2); ImageTriggerProcess(hWnd, location, model); } else if (model.EventType == EventType.Keyboard) { KeyboardTriggerProcess(processConfigModel.Processes[i].MainWindowHandle, model); } if (!await TaskHelper.TokenCheckDelayAsync(model.AfterDelay, processConfigModel.Token)) { break; } if (model.EventToNext > 0 && model.TriggerIndex != model.EventToNext) { IBaseEventTriggerModel nextModel = null; if (model is GameEventTriggerModel) { nextModel = ObjectExtensions.GetInstance <CacheDataManager>().GetGameEventTriggerModel(model.EventToNext); } else if (model is EventTriggerModel) { nextModel = ObjectExtensions.GetInstance <CacheDataManager>().GetEventTriggerModel(model.EventToNext); } if (nextModel != null) { LogHelper.Debug($">>>>Next Move Event : CurrentIndex [ {model.TriggerIndex} ] NextIndex [ {nextModel.TriggerIndex} ] "); return(Tuple.Create(isExcute, nextModel)); } } } } } } } await TaskHelper.TokenCheckDelayAsync(processConfigModel.ItemDelay, processConfigModel.Token); return(Tuple.Create <bool, IBaseEventTriggerModel>(isExcute, null)); }
private void MouseTriggerProcess(IntPtr hWnd, Point location, IBaseEventTriggerModel model, Tuple <float, float> factor, ProcessConfigModel config) { var mousePosition = new Point() { X = Math.Abs(model.ProcessInfo.Position.Left + (model.MouseTriggerInfo.StartPoint.X + location.X) * -1) * factor.Item1, Y = Math.Abs(model.ProcessInfo.Position.Top + (model.MouseTriggerInfo.StartPoint.Y + location.Y) * -1) * factor.Item2 }; if (model.MouseTriggerInfo.MouseInfoEventType == MouseEventType.LeftClick) { LogHelper.Debug($">>>>LMouse Save Position X : {model.MouseTriggerInfo.StartPoint.X} Save Position Y : {model.MouseTriggerInfo.StartPoint.Y} Target X : { mousePosition.X } Target Y : { mousePosition.Y }"); NativeHelper.PostMessage(hWnd, WindowMessage.LButtonDown, 1, mousePosition.ToLParam()); Task.Delay(100).Wait(); NativeHelper.PostMessage(hWnd, WindowMessage.LButtonUp, 0, mousePosition.ToLParam()); } else if (model.MouseTriggerInfo.MouseInfoEventType == MouseEventType.RightClick) { LogHelper.Debug($">>>>RMouse Save Position X : {model.MouseTriggerInfo.StartPoint.X} Save Position Y : {model.MouseTriggerInfo.StartPoint.Y} Target X : { mousePosition.X } Target Y : { mousePosition.Y }"); NativeHelper.PostMessage(hWnd, WindowMessage.RButtonDown, 1, mousePosition.ToLParam()); Task.Delay(100).Wait(); NativeHelper.PostMessage(hWnd, WindowMessage.RButtonDown, 0, mousePosition.ToLParam()); } else if (model.MouseTriggerInfo.MouseInfoEventType == MouseEventType.Drag) { LogHelper.Debug($">>>>Drag Mouse Save Position X : {model.MouseTriggerInfo.StartPoint.X} Save Position Y : {model.MouseTriggerInfo.StartPoint.Y} Target X : { mousePosition.X } Target Y : { mousePosition.Y }"); NativeHelper.PostMessage(hWnd, WindowMessage.LButtonDown, 1, mousePosition.ToLParam()); Task.Delay(10).Wait(); for (int i = 0; i < model.MouseTriggerInfo.MiddlePoint.Count; ++i) { mousePosition = new Point() { X = Math.Abs(model.ProcessInfo.Position.Left + model.MouseTriggerInfo.MiddlePoint[i].X * -1) * factor.Item1, Y = Math.Abs(model.ProcessInfo.Position.Top + model.MouseTriggerInfo.MiddlePoint[i].Y * -1) * factor.Item2 }; NativeHelper.PostMessage(hWnd, WindowMessage.MouseMove, 1, mousePosition.ToLParam()); Task.Delay(config.DragDelay).Wait(); } mousePosition = new Point() { X = Math.Abs(model.ProcessInfo.Position.Left + model.MouseTriggerInfo.EndPoint.X * -1) * factor.Item1, Y = Math.Abs(model.ProcessInfo.Position.Top + model.MouseTriggerInfo.EndPoint.Y * -1) * factor.Item2 }; NativeHelper.PostMessage(hWnd, WindowMessage.MouseMove, 1, mousePosition.ToLParam()); Task.Delay(10).Wait(); NativeHelper.PostMessage(hWnd, WindowMessage.LButtonUp, 0, mousePosition.ToLParam()); LogHelper.Debug($">>>>Drag Mouse Save Position X : {model.MouseTriggerInfo.EndPoint.X} Save Position Y : {model.MouseTriggerInfo.EndPoint.Y} Target X : { mousePosition.X } Target Y : { mousePosition.Y }"); } else if (model.MouseTriggerInfo.MouseInfoEventType == MouseEventType.Wheel) { LogHelper.Debug($">>>>Wheel Save Position X : {model.MouseTriggerInfo.StartPoint.X} Save Position Y : {model.MouseTriggerInfo.StartPoint.Y} Target X : { mousePosition.X } Target Y : { mousePosition.Y }"); //NativeHelper.PostMessage(hWnd, WindowMessage.LButtonDown, 1, mousePosition.ToLParam()); //Task.Delay(100).Wait(); //NativeHelper.PostMessage(hWnd, WindowMessage.LButtonUp, 0, mousePosition.ToLParam()); //NativeHelper.PostMessage(hWnd, WindowMessage.MouseWheel, ObjectExtensions.MakeWParam((uint)WindowMessage.MKControl, (uint)(model.MouseTriggerInfo.WheelData * -1)), 0); //var hwnd = NativeHelper.FindWindowEx(NativeHelper.FindWindow(null, "Test.txt - 메모장"), IntPtr.Zero, "Edit", null); //var p = new System.Drawing.Point(0, 0); NativeHelper.PostMessage(hWnd, WindowMessage.MouseWheel, ObjectExtensions.MakeWParam(0, model.MouseTriggerInfo.WheelData * ConstHelper.WheelDelta), mousePosition.ToLParam()); } }
public override async Task <IBaseEventTriggerModel> InvokeNextEventTriggerAsync(IBaseEventTriggerModel saveModel, ProcessConfigModel processEventTriggerModel) { if (processEventTriggerModel.Token.IsCancellationRequested) { return(null); } int hpPercent = 100; int mpPercent = 100; Dispatcher.Invoke(() => { if (_hpRoiPosition != null) { var lower = Tuple.Create(_colorDatas["HP"].Lower.R, _colorDatas["HP"].Lower.G, _colorDatas["HP"].Lower.B); var upper = Tuple.Create(_colorDatas["HP"].Upper.R, _colorDatas["HP"].Upper.G, _colorDatas["HP"].Upper.B); foreach (var process in processEventTriggerModel.Processes) { CheckPercentageImage(_hpRoiPosition, process, lower, upper); } } }); var nextModel = await TriggerProcess(saveModel as GameEventTriggerModel, processEventTriggerModel); return(nextModel.Item2); }
public async Task <Tuple <bool, IBaseEventTriggerModel> > TriggerProcess <T>(T model, ProcessConfigModel processConfigModel) where T : BaseEventTriggerModel <T> { var isExcute = true; await TaskHelper.TokenCheckDelayAsync(processConfigModel.ItemDelay, processConfigModel.Token); return(Tuple.Create <bool, IBaseEventTriggerModel>(isExcute, null)); }