From 8df62702872766fa83993401c777fd00cf5f7627 Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Fri, 2 Aug 2024 16:51:49 +0900 Subject: [PATCH] Update the screen time feature on WelsonJS.Service --- .../WelsonJS.Service/ScreenMatching.cs | 85 ++++++++++-------- .../WelsonJS.Service/ServiceMain.cs | 36 ++++---- bin/x86/WelsonJS.Service.exe | Bin 20480 -> 20992 bytes bin/x86/WelsonJS.Service.pdb | Bin 54784 -> 54784 bytes 4 files changed, 67 insertions(+), 54 deletions(-) diff --git a/WelsonJS.Toolkit/WelsonJS.Service/ScreenMatching.cs b/WelsonJS.Toolkit/WelsonJS.Service/ScreenMatching.cs index 2c097fd..c46d6be 100644 --- a/WelsonJS.Toolkit/WelsonJS.Service/ScreenMatching.cs +++ b/WelsonJS.Toolkit/WelsonJS.Service/ScreenMatching.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Drawing; using System.IO; using System.Runtime.InteropServices; +using System.ServiceProcess; using System.Text; using System.Windows.Forms; using WelsonJS.Service; @@ -48,11 +49,15 @@ public class ScreenMatching public int Bottom; } + ServiceMain parent; public List templateImages; string templateFolderPath; + int currentTemplateIndex = 0; - public ScreenMatching(string workingDirectory) + public ScreenMatching(ServiceBase _parent, string workingDirectory) { + parent = (ServiceMain)_parent; + templateFolderPath = Path.Combine(workingDirectory, "app/assets/img/_templates"); templateImages = new List(); LoadTemplateImages(); @@ -80,20 +85,21 @@ public class ScreenMatching Screen screen = Screen.AllScreens[i]; Bitmap mainImage = CaptureScreen(screen); - foreach (Bitmap templateImage in templateImages) - { - Point matchLocation = FindTemplate(mainImage, (Bitmap)templateImage.Clone(), out double maxCorrelation); + Bitmap image = templateImages[currentTemplateIndex]; + parent.Log($"Matching template {image.Tag as string} on the screen {i}..."); - results.Add(new ScreenMatchResult - { - FileName = templateImage.Tag.ToString(), - ScreenNumber = i, - Location = matchLocation, - MaxCorrelation = maxCorrelation - }); - } + Point matchLocation = FindTemplate(mainImage, (Bitmap)image.Clone(), out double maxCorrelation); + results.Add(new ScreenMatchResult + { + FileName = image.Tag.ToString(), + ScreenNumber = i, + Location = matchLocation, + MaxCorrelation = maxCorrelation + }); } + currentTemplateIndex = ++currentTemplateIndex % templateImages.Count; + return results; } @@ -126,21 +132,19 @@ public class ScreenMatching Bitmap windowImage = CaptureWindow(hWnd); if (windowImage != null) { - foreach (var templateImage in templateImages) - { - Point matchLocation = FindTemplate(windowImage, templateImage, out double maxCorrelation); - string templateFileName = templateImage.Tag as string; + Bitmap image = templateImages[currentTemplateIndex]; + Point matchLocation = FindTemplate(windowImage, image, out double maxCorrelation); + string templateFileName = image.Tag as string; - var result = new ScreenMatchResult - { - FileName = templateFileName, - WindowHandle = hWnd, - WindowTitle = windowTitle, - Location = matchLocation, - MaxCorrelation = maxCorrelation - }; - results.Add(result); - } + var result = new ScreenMatchResult + { + FileName = templateFileName, + WindowHandle = hWnd, + WindowTitle = windowTitle, + Location = matchLocation, + MaxCorrelation = maxCorrelation + }; + results.Add(result); } } catch { } @@ -148,6 +152,8 @@ public class ScreenMatching return true; }, IntPtr.Zero); + currentTemplateIndex = ++currentTemplateIndex % templateImages.Count; + return results; } @@ -194,10 +200,10 @@ public class ScreenMatching { for (int y = 0; y <= mainHeight - templateHeight; y++) { - if (IsTemplateMatch(mainImage, templateImage, x, y)) + if (IsTemplateMatch(mainImage, templateImage, x, y, 0.8)) // matched 80% or above { bestMatch = new Point(x, y); - maxCorrelation = 1; // 완전 일치 + maxCorrelation = 1; return bestMatch; } } @@ -206,22 +212,29 @@ public class ScreenMatching return bestMatch; } - private bool IsTemplateMatch(Bitmap mainImage, Bitmap templateImage, int offsetX, int offsetY) + private bool IsTemplateMatch(Bitmap mainImage, Bitmap templateImage, int offsetX, int offsetY, double threshold = 1.0) { int templateWidth = templateImage.Width; int templateHeight = templateImage.Height; + int totalPixels = templateWidth * templateHeight; + int requiredMatches = (int)(totalPixels * threshold); + int matchedCount = 0; + Random rand = new Random(); - for (int x = 0; x < templateWidth; x++) + while (matchedCount < requiredMatches) { - for (int y = 0; y < templateHeight; y++) + int x = rand.Next(templateWidth); + int y = rand.Next(templateHeight); + Point point = new Point(x, y); + + if (mainImage.GetPixel(x + offsetX, y + offsetY) != templateImage.GetPixel(x, y)) { - if (mainImage.GetPixel(x + offsetX, y + offsetY) != templateImage.GetPixel(x, y)) - { - return false; - } + return false; } + + matchedCount++; } return true; } -} +} \ No newline at end of file diff --git a/WelsonJS.Toolkit/WelsonJS.Service/ServiceMain.cs b/WelsonJS.Toolkit/WelsonJS.Service/ServiceMain.cs index ae3dc2b..7f9bb08 100644 --- a/WelsonJS.Toolkit/WelsonJS.Service/ServiceMain.cs +++ b/WelsonJS.Toolkit/WelsonJS.Service/ServiceMain.cs @@ -31,6 +31,7 @@ using System.Runtime.InteropServices; using MSScriptControl; using System.IO; using System.Collections.Generic; +using System.Threading.Tasks; namespace WelsonJS.Service { @@ -204,11 +205,11 @@ namespace WelsonJS.Service // set screen timer if (!disabledScreenTime) { - screenMatcher = new ScreenMatching(workingDirectory); + screenMatcher = new ScreenMatching(this, workingDirectory); Timer screenTimer = new Timer { - Interval = 10000 // 10 seconds + Interval = 5000 // 5 seconds }; screenTimer.Elapsed += OnScreenTime; timers.Add(screenTimer); @@ -287,22 +288,6 @@ namespace WelsonJS.Service return "void"; } - - private void Log(string message) - { - string _message = $"{DateTime.Now}: {message}"; - - if (Environment.UserInteractive) - { - Console.WriteLine(_message); - } - - using (StreamWriter writer = new StreamWriter(logFilePath, true)) - { - writer.WriteLine(_message); - } - } - private Dictionary ParseArguments(string[] args) { var arguments = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -328,5 +313,20 @@ namespace WelsonJS.Service return arguments; } + + public void Log(string message) + { + string _message = $"{DateTime.Now}: {message}"; + + if (Environment.UserInteractive) + { + Console.WriteLine(_message); + } + + using (StreamWriter writer = new StreamWriter(logFilePath, true)) + { + writer.WriteLine(_message); + } + } } } diff --git a/bin/x86/WelsonJS.Service.exe b/bin/x86/WelsonJS.Service.exe index 54283724b508a7a97820e94ffc2bbc7e66bfca55..793a390e41d3dec1ef3ef61a0176af5f32863c5d 100644 GIT binary patch delta 8769 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 delta 8379 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 diff --git a/bin/x86/WelsonJS.Service.pdb b/bin/x86/WelsonJS.Service.pdb index a3cc609a654dd2e055bb4c20f3fde848702f5a16..f26eda94cc4969b102e1f65df638068af6e7d998 100644 GIT binary patch delta 7503 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 M_pB96IF}p!pIq&&`2YX_ delta 7392 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