コード例 #1
0
        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;
        }
コード例 #2
0
 public ScreenChangedDispatcher()
     : base()
 {
     EventName     = "ScreenChanged";
     _screenbounds = ScreenUtilities.GetScreenBounds();
 }