From 56bbe836ca7171f1d151c8081098773b3d148308 Mon Sep 17 00:00:00 2001 From: Lesueur Benjamin Date: Wed, 11 Dec 2019 14:47:56 +0100 Subject: [PATCH] Code cleanup / multithreading - Cleaned most of the mess. - Fixed some issues with d3_Rect.Bottom calculation. - Greatly improved ui drawing and threading. --- ControllerSettings.cs | 4 +- MainWindow.xaml | 6 +- MainWindow.xaml.cs | 154 ++++++++++++++++++----------------- Ressources/XBOne_Gamepad.png | Bin 0 -> 35183 bytes d3gamepad.csproj | 3 + 5 files changed, 89 insertions(+), 78 deletions(-) create mode 100644 Ressources/XBOne_Gamepad.png diff --git a/ControllerSettings.cs b/ControllerSettings.cs index a297253..336defc 100755 --- a/ControllerSettings.cs +++ b/ControllerSettings.cs @@ -288,11 +288,11 @@ public bool UpdateScreenValues() d3_Rect.Left = Int32.Parse(Between(ref readText, "DisplayModeWinLeft \"", "\"", false)); d3_Rect.Top = Int32.Parse(Between(ref readText, "DisplayModeWinTop \"", "\"", false)); d3_Rect.Right = d3_Rect.Left + d3Width; - d3_Rect.Bottom = d3_Rect.Top + d3Height; // Windows bar d3_Rect.Top += 30; - d3Height -= 30; + d3Height -= 38; // why 8 ?! + d3_Rect.Bottom = d3_Rect.Top + d3Height; } else { diff --git a/MainWindow.xaml b/MainWindow.xaml index 8181ae2..d7a2ff4 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -1,6 +1,8 @@  - + Title="d3gamepad" Height="720" Width="1280" Topmost="True" AllowsTransparency="True" WindowStyle="None" Background="{x:Null}" Left="0" Top="0"> + + + \ No newline at end of file diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 5931f71..ee19477 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -26,24 +26,21 @@ public partial class MainWindow : Window private static GameController _gameController; private static InputSimulator _inputSimulator; private static ControllerSettings _settings; - - [DllImport("user32.dll")] - static extern bool GetCursorPos(ref System.Drawing.Point lpPoint); - - [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)] - public static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop); [DllImport("User32.Dll")] public static extern long SetCursorPos(int x, int y); + [DllImport("user32.dll")] + static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll")] + static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); + public static Bitmap CaptureFromScreen(System.Drawing.Point location, int width, int height) { Bitmap bmpScreenCapture = new Bitmap(width, height); - Graphics p = Graphics.FromImage(bmpScreenCapture); - p.CopyFromScreen(location.X,location.Y, 0, 0, new System.Drawing.Size(width, height), CopyPixelOperation.SourceCopy); - p.Dispose(); return bmpScreenCapture; @@ -52,9 +49,7 @@ public static Bitmap CaptureFromScreen(System.Drawing.Point location, int width, public static System.Drawing.Color GetColorFromScreen(System.Drawing.Point location) { Bitmap map = CaptureFromScreen(location,1,1); - System.Drawing.Color c = map.GetPixel(0, 0); - map.Dispose(); return c; @@ -65,7 +60,7 @@ public static System.Drawing.Color GetColorFromScreen(System.Drawing.Point locat static double default_padding = 11; static double default_cell = 56; static double default_bottom = 22; - static double default_checkui = 120; + static double default_checkui = 17; static double default_check_inventory_w = 17; static double default_check_inventory_h = 26; @@ -84,8 +79,8 @@ public static System.Drawing.Color GetColorFromScreen(System.Drawing.Point locat private static void ComputeScreenValues() { - current_h_ratio = (double)_settings.UIHeight; - current_w_ratio = (double)_settings.UIWidth; + current_h_ratio = _settings.UIHeight; + current_w_ratio = _settings.UIWidth; compute_h_ratio = current_h_ratio / default_h_ratio; compute_w_ratio = current_w_ratio / default_w_ratio; @@ -104,12 +99,6 @@ private static void ComputeScreenValues() current_life_check_left = default_life_check_left * compute_h_ratio; } - [DllImport("user32.dll")] - static extern IntPtr GetForegroundWindow(); - - [DllImport("user32.dll")] - static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); - private static string GetActiveWindowTitle() { const int nChars = 256; @@ -130,15 +119,14 @@ private static bool IsInGame() private static bool IsInMap() { - double cursor_x = _settings.d3_Rect.Left + _settings.c_d3Width; + double cursor_x = _settings.d3_Rect.Left + _settings.c_d3Width - (34 * compute_h_ratio); double cursor_y = _settings.d3_Rect.Bottom - current_checkui; System.Drawing.Point cursor = new System.Drawing.Point((int)cursor_x, (int)cursor_y); System.Drawing.Color c = GetColorFromScreen(cursor); - if (c.R >= 130 && c.G >= 130 && c.B >= 130) - if(c.R <= 220 && c.G <= 220 && c.B <= 220) - return true; + if (c.G > c.R && c.G > c.B && c.R <= 50 && c.G >= 100 && c.B <= 50) + return true; return false; } @@ -180,7 +168,6 @@ private static int CheckHealth() G = c.G > 0 ? c.G : 1; B = c.B > 0 ? c.B : 1; - Trace.WriteLine(R + "," + G + "," + B); if (R / G > 2 && R / B > 2 && R > 50 && R < 140) break; else @@ -240,57 +227,32 @@ public static void ThreadUI() ComputeScreenValues(); Application.Current.Dispatcher.BeginInvoke((Action)(() => { - myCanvas.Children.Clear(); myForm.Height = _settings.d3Height; myForm.Width = _settings.d3Width; myForm.Top = _settings.d3_Rect.Top; myForm.Left = _settings.d3_Rect.Left; - draw_pos_x = _settings.c_d3Width - (current_padding / 2); - draw_pos_y = _settings.d3Height - current_cell - (default_bottom * compute_h_ratio); + myGamepad.Width = (int)current_cell; + myGamepad.Height = (int)current_cell; + Canvas.SetTop(myGamepad, 40 * compute_h_ratio); // temp + Canvas.SetLeft(myGamepad, _settings.d3Width - (90 * compute_h_ratio)); // temp - for (int i = 0; i < 5; i++) - draw_pos_x -= current_cell; + draw_pos_x = _settings.c_d3Width - (current_padding / 2) - current_cell; + draw_pos_y = _settings.d3Height - current_cell - current_bottom; for (int i = 0; i < 4; i++) - draw_pos_x -= current_padding; - - if (_settings.DisplayModeWindowMode == 1) - draw_pos_y -= 8; + draw_pos_x -= (current_cell + current_padding); - string ico; - for (int i = -9; i <= 3; i += 2) + foreach(UIElement item in myCanvas.Children) { - switch (i) + if (item is System.Windows.Shapes.Rectangle) { - case -9: ico = "B"; break; - case -7: ico = "Y"; break; - case -5: ico = "RB"; break; - case -3: ico = "RT"; break; - case -1: ico = "X"; break; - case 1: ico = "A"; break; - case 3: ico = "LB"; break; - default: ico = "B"; break; - } + ((System.Windows.Shapes.Rectangle)item).Width = (int)current_cell / 2; + ((System.Windows.Shapes.Rectangle)item).Height = (int)current_cell / 2; + + Canvas.SetTop(item, draw_pos_y); + Canvas.SetLeft(item, draw_pos_x); - System.Windows.Shapes.Rectangle rect = new System.Windows.Shapes.Rectangle - { - Name = "button_" + ico, - Fill = new ImageBrush - { - ImageSource = new System.Windows.Media.Imaging.BitmapImage(new Uri(".\\Ressources\\XBOne_" + ico + ".png", UriKind.Relative)) - }, - Width = (int)current_cell / 2, - Height = (int)current_cell / 2, - Stretch = Stretch.Uniform, - }; - - Canvas.SetTop(rect, draw_pos_y); - Canvas.SetLeft(rect, draw_pos_x); - myCanvas.Children.Add(rect); - - if (i <= 1) - { draw_pos_x += current_cell; draw_pos_x += current_padding; } @@ -300,13 +262,32 @@ public static void ThreadUI() })); } - if (IsInGame() && IsInMap()) - { - if(myCanvas.Visibility == Visibility.Hidden) - Application.Current.Dispatcher.BeginInvoke((Action)(() => { myCanvas.Visibility = Visibility.Visible; })); - } - else if (myCanvas.Visibility == Visibility.Visible) - Application.Current.Dispatcher.BeginInvoke((Action)(() => { myCanvas.Visibility = Visibility.Hidden; })); + Application.Current.Dispatcher.BeginInvoke((Action)(() => { + if (IsInGame()) + { + myCanvas.Visibility = Visibility.Visible; + + if (_gameController.IsConnected()) + myGamepad.Visibility = Visibility.Visible; + else + myGamepad.Visibility = Visibility.Hidden; + + if (IsInMap()) + { + foreach (UIElement item in myCanvas.Children) + if (item is System.Windows.Shapes.Rectangle) + item.Visibility = Visibility.Visible; + } + else + { + foreach (UIElement item in myCanvas.Children) + if (item is System.Windows.Shapes.Rectangle) + item.Visibility = Visibility.Hidden; + } + } + else + myCanvas.Visibility = Visibility.Hidden; + })); Thread.Sleep(100); } @@ -314,6 +295,7 @@ public static void ThreadUI() static d3gamepad.MainWindow myForm; static Canvas myCanvas; + static System.Windows.Controls.Image myGamepad; public MainWindow() { InitializeComponent(); @@ -329,6 +311,33 @@ public MainWindow() // STATICS myForm = Form1; myCanvas = Canvas1; + myGamepad = GamepadIco; + + string ico = "Menu"; + for (int i = 0; i < 7; i ++) + { + switch (i) + { + case 0: ico = "B"; break; + case 1: ico = "Y"; break; + case 2: ico = "RB"; break; + case 3: ico = "RT"; break; + case 4: ico = "X"; break; + case 5: ico = "A"; break; + case 6: ico = "LB"; break; + } + + System.Windows.Shapes.Rectangle rect = new System.Windows.Shapes.Rectangle + { + Fill = new ImageBrush + { + ImageSource = new System.Windows.Media.Imaging.BitmapImage(new Uri(".\\Ressources\\XBOne_" + ico + ".png", UriKind.Relative)) + }, + Stretch = Stretch.Uniform, + }; + + myCanvas.Children.Add(rect); + } Thread myThread = new Thread(new ThreadStart(ThreadHealth)); myThread.Start(); @@ -340,9 +349,6 @@ public MainWindow() myThread3.Start(); } - [DllImport("user32.dll", SetLastError = true)] - private static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize); - [StructLayout(LayoutKind.Sequential)] private struct INPUT { diff --git a/Ressources/XBOne_Gamepad.png b/Ressources/XBOne_Gamepad.png new file mode 100644 index 0000000000000000000000000000000000000000..58e43e27e896abf91f695fd6400c4bdbfd8354e2 GIT binary patch literal 35183 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%0AAr%wt>p9ENEp@#$$ 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 k;~sEuDr3Pt=6>{-zNc@3I{BTF6b}5ksi>(?EN2 Always + + Always +