public static void ReCalculateAddonPositions() { Rectangle rect; var handles = GetGameHandles(); var locations = new Dictionary <IntPtr, Rectangle>(); for (var i = 0; i < handles.Count; i++) { var handle = handles[i]; try { GetWindowRect(handle, out rect); SetForegroundWindow(handle); Thread.Sleep(500); rect.Width -= rect.X; rect.Height -= rect.Y; Bitmap clone; var bounds = ScreenUtilities.GetScreenBounds(); var winBottomLeft = new Point(rect.X, rect.Y + rect.Height); var scanArea = new Rectangle(winBottomLeft.X, winBottomLeft.Y - 500, 500, 500); if (scanArea.Y < 0) { scanArea.Height += scanArea.Y; scanArea.Y = 0; } if (scanArea.X < 0) { scanArea.Width += scanArea.X; scanArea.X = 0; } Console.WriteLine($"Scan area x:{scanArea.X}, y:{scanArea.Y}, w:{scanArea.Width}, h:{scanArea.Height}"); using (var bitmap = new Bitmap(bounds.Width, bounds.Height)) { using (var g = Graphics.FromImage(bitmap)) { g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size); } clone = bitmap.Clone(scanArea, PixelFormat.Format24bppRgb); } var addonBottomLeft = FindAddonBottomLeft(clone); var frameSize = CalculateFrameSize(addonBottomLeft, clone); if (frameSize <= 1) { Console.WriteLine("Could not locate addon on screen."); locations.Add(handles[i], new Rectangle(1, 1, 1, 1)); continue; } var settings = SettingsLoader.LoadSettings <AppSettings>("settings.json"); var location = new Rectangle( scanArea.X + addonBottomLeft.X, scanArea.Y + addonBottomLeft.Y - (frameSize * settings.AddonRowCount) + 1, frameSize * settings.AddonColumnCount, frameSize * settings.AddonRowCount); if (location.Height == 0 || location.Width == 0) { Console.WriteLine("Could not locate addon on screen."); location = new Rectangle(1, 1, 1, 1); } else { Console.WriteLine("Ingame addon successfully located on screen: " + location); } locations.Add(handles[i], location); Thread.Sleep(200); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine("Exception: Could not locate addon on screen."); locations.Add(handles[i], new Rectangle(1, 1, 1, 1)); } } InGameAddonLocations = locations; }
public ScreenChangedDispatcher() : base() { EventName = "ScreenChanged"; _screenbounds = ScreenUtilities.GetScreenBounds(); }