static void MonitorScreenshots() { var outDir = @"t:\Data\Gumball\Screenshots"; var vm_title = "BlueStacks"; var handle = DirectGamer.FindWindow(null, vm_title); if (handle == IntPtr.Zero) { throw new Exception("Окно не найдено"); } DirectGamer.RECT rect; DirectGamer.GetWindowRect(handle, out rect); Console.WriteLine($"{rect.Right - rect.Left} {rect.Bottom - rect.Top}"); var hashes = new Dictionary <Shipwreck.Phash.Digest, int>(new DigestComparer()); Shipwreck.Phash.Digest prevHash = null; for (var i = 0; ; i++) { var screenshot = DirectGamer.GetScreenImage(new System.Drawing.Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top)); var hash = ComputeDigest(screenshot); //var isOther = prevHash == null || Shipwreck.Phash.ImagePhash.GetCrossCorrelation(prevHash, hash) < 1; var isOther = prevHash == null || hashes.Keys.All(_hash => ImagePhash.GetCrossCorrelation(_hash, hash) < 1); if (isOther) { screenshot.Save(System.IO.Path.Combine(outDir, $"{DateTime.UtcNow:yyMMdd.HHmmss}.png")); } //System.IO.File.WriteAllBytes(System.IO.Path.Combine(outDir, $"{DateTime.UtcNow:yyMMdd.HHmmss}.png"), stream.ToArray()); Console.WriteLine($"{i:d4} {hash} - {(isOther ? "saved" : "skipped")}"); prevHash = hash; hashes[hash] = (hashes.ContainsKey(hash) ? hashes[hash] : 0) + 1; System.Threading.Thread.Sleep(TimeSpan.FromSeconds(0.1)); } }
//C:\Users\Serge\AppData\Local\Android\sdk\platform-tools > adb start-server //adb devices -- посмотреть список устройств //adb kill-server -- с последующим start-server, помогает увидеть blue-stacks // //посмотреть текущее разрешение //adb shell dumpsys displays //https://stackoverflow.com/questions/7527459/android-device-screen-size static void Main(string[] args) { NitroBolt.CommandLine.CommandLineManager.Process(args, typeof(Program).Assembly); return; Task.Run(OrleansServer.Execute).Wait(); return; Processor.ToHsv(); return; Walker.Execute(); return; if (true) { var filenames = new[] { @"t:\Data\Jewel\Screenshots\180721.004138.png", @"t:\Data\Jewel\Screenshots\180709.010322.png", @"t:\Data\Jewel\Screenshots\180709.010049.png", @"t:\Data\Jewel\Screenshots\180709.005842.png", @"t:\Data\Jewel\Screenshots\180709.005615.png", @"t:\Data\Jewel\Screenshots\180709.005604.png", }; foreach (var filename in filenames) { var(h, s, v) = Imager.ToHsv(filename); Console.WriteLine($"{h}, {s}, {v}"); } } //GOcr.ToPerception(); //GOcr.Execute(); return; //return; Perception(); return; MonitorScreenshotsByAdb(); return; var screenshot1 = AdbScreenCapture(); System.IO.File.WriteAllBytes("screen -capture.png", screenshot1); return; MonitorScreenshots(); return; PhashExecuting(); return; SaveMazeCellImages(); return; var vm_title = "BlueStacks"; var handle = DirectGamer.FindWindow(null, vm_title); if (handle == IntPtr.Zero) { throw new Exception("Окно не найдено"); } //DirectGamer.PostMessage(new System.Runtime.InteropServices.HandleRef(null, handle), DirectGamer.WM_SIZE, new IntPtr(0), new IntPtr((1200 << 16) + 600)); DirectGamer.RECT rect; DirectGamer.GetWindowRect(handle, out rect); Console.WriteLine($"{rect.Right - rect.Left} {rect.Bottom - rect.Top}"); var screenshot = DirectGamer.GetScreenImage(new System.Drawing.Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top)); screenshot.Save("gumballs.screenshot.png"); var screenWidth = 900; var screenHeight = 1600; var headerHeight = 40; var footerHeight = 40; var cellWidth = 167; //var cellHeight = 180; var cellHeight = 156; var mazeX = 30; var mazeY = 277; if (true) { var dx = screenshot.Width / (float)screenWidth; var dy = (screenshot.Height - headerHeight - footerHeight) / (float)screenHeight; var image = new Bitmap(screenshot); using (var g = Graphics.FromImage(image)) { var pen = new Pen(Color.Red); Action <Pen, float, float, float, float> drawLine = (p, x1, y1, x2, y2) => g.DrawLine(p, x1 * dx, y1 * dy + headerHeight, x2 * dx, y2 * dy + headerHeight); for (var y = 0; y <= 6; ++y) { drawLine(pen, mazeX, mazeY + y * cellHeight, mazeX + cellWidth * 5, mazeY + y * cellHeight); } for (var x = 0; x <= 5; ++x) { drawLine(pen, mazeX + x * cellWidth, mazeY, mazeX + x * cellWidth, mazeY + 6 * cellHeight); } } image.Save("gumballs.lines.png"); } return; //DirectGamer.PostMessage(new System.Runtime.InteropServices.HandleRef(null, handle), DirectGamer.WM_LBUTTONDOWN, new IntPtr(DirectGamer.MK_LBUTTON), new IntPtr((100 << 16) + 100)); if (true) { // 2 4 ?? дверь, не сработала var x = 0; var y = 4; Shell($"input tap {mazeX + cellWidth / 2 + x * cellWidth} {mazeY + cellHeight/2 + y * cellHeight}"); //maze cell 1 2 } //screenshot: cell 1 2: 110 322 - 206 426 //Shell("input tap 193 620"); //maze cell 0 2 //Shell($"input tap 365 {787 + cellHeight}"); //maze cell 1 2 //Shell("input tap 193 599"); //maze cell 2 2 //Shell("input tap 194 600"); //maze cell 1 2 //Shell("input tap 364 786"); //maze cell 1 2 //Shell("input tap 365 787"); //maze cell 2 3 return; //Shell($"input tap 10 800"); //maze рамка //Shell($"input tap 20 850"); //maze рамка //Shell($"input tap 25 850"); //maze cell 0 3 //Shell("input tap 20 50"); //левый верхний угол //Shell("input tap 100 300"); //maze cell 0 0 //Shell($"input tap 170 620"); //maze cell 0 2 //Shell($"input tap 300 800"); //maze cell 1 3 //Shell("input tap 500 300"); //maze cell 2 0 //Shell("input tap 700 300"); //maze cell 3 0 //Shell("input tap 650 300"); //maze cell 3 0 //Shell("input tap 600 300"); //maze cell 3 0 //Shell("input tap 750 300"); //maze cell 4 0 Shell("input tap 800 300"); //maze cell 4 0 //Shell("input tap 900 300"); //вне экрана //Shell("input tap 800 300"); //maze cell 3 0 //Shell("input tap 00 300"); //maze cell 3 0 return; return; Shell("input keyevent 4");//back кнопка Shell("input keyevent 4"); }