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)); }