From 275ce485099dedf559b353def396886522273e81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Sat, 10 Dec 2022 17:00:09 +0100 Subject: [PATCH] Depend on `GetCursorPos` to detect `SAS` --- RELEASE.md | 1 + SteamController/Context.cs | 6 +- SteamController/ContextDebug.cs | 7 +- SteamController/Devices/KeyboardController.cs | 33 +-- SteamController/Devices/MouseController.cs | 190 +++++++----------- SteamController/Managers/SASManager.cs | 14 +- 6 files changed, 118 insertions(+), 133 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 0d49329..48d1508 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -23,3 +23,4 @@ - DEBUG allows to keep X360 controller always connected - Swap `STEAM+Menu` and `STEAM+Options`. It makes more sense to switch windows with STEAM+3 horizontal lines - If application is run with `-run-on-startup` it will self-set to run on system start +- Depend on `GetCursorPos` to detect `SAS` diff --git a/SteamController/Context.cs b/SteamController/Context.cs index 9559775..9327a4e 100644 --- a/SteamController/Context.cs +++ b/SteamController/Context.cs @@ -41,7 +41,6 @@ namespace SteamController } public bool RequestEnable { get; set; } = true; - public bool KeyboardMouseValid { get; set; } = true; public ContextState State; public event Action ProfileChanged; @@ -52,6 +51,11 @@ namespace SteamController get { return RequestEnable; } } + public bool KeyboardMouseValid + { + get { return SteamController.Managers.SASManager.Valid; } + } + public Profiles.Profile? CurrentProfile { get diff --git a/SteamController/ContextDebug.cs b/SteamController/ContextDebug.cs index 134f842..bac7e85 100644 --- a/SteamController/ContextDebug.cs +++ b/SteamController/ContextDebug.cs @@ -20,10 +20,9 @@ namespace SteamController items.Add("[LB]"); if (Steam.LizardMouse) items.Add("[LM]"); - if (X360.Connected) - items.Add("[X360]"); - else if (X360.Valid) - items.Add("[no-X360]"); + + items.Add(X360.Connected ? "[X360]" : X360.Valid ? "[no-X360]" : "[inv-X360]"); + items.Add(KeyboardMouseValid ? "[KM]" : "[inv-KM]"); foreach (var button in Steam.AllButtons) { diff --git a/SteamController/Devices/KeyboardController.cs b/SteamController/Devices/KeyboardController.cs index 470087f..3a0da3e 100644 --- a/SteamController/Devices/KeyboardController.cs +++ b/SteamController/Devices/KeyboardController.cs @@ -86,20 +86,32 @@ namespace SteamController.Devices keyCodes = new Dictionary(); } + private void Safe(Action action) + { + try + { + action(); + + Managers.SASManager.Valid = true; + } + catch (InvalidOperationException) + { + Managers.SASManager.Valid = false; + } + } + internal void Update() { // Key Up: it is missing now foreach (var keyUp in lastKeyCodes.Except(keyCodes)) { - try { simulator.Keyboard.KeyUp(keyUp.Key); } - catch (InvalidOperationException) { } + Safe(() => simulator.Keyboard.KeyUp(keyUp.Key)); } // Key Down: new keys being down foreach (var keyDown in keyCodes.Except(lastKeyCodes)) { - try { simulator.Keyboard.KeyDown(keyDown.Key); } - catch (InvalidOperationException) { } + Safe(() => simulator.Keyboard.KeyDown(keyDown.Key)); } // Key Repeats @@ -109,29 +121,24 @@ namespace SteamController.Devices if (keyPress.Value > now) continue; - try { simulator.Keyboard.KeyPress(keyPress.Key); } - catch (InvalidOperationException) { } - + Safe(() => simulator.Keyboard.KeyPress(keyPress.Key)); keyCodes[keyPress.Key] = DateTime.Now.Add(NextRepeats); } } public void KeyPress(params VirtualKeyCode[] keyCodes) { - try { simulator.Keyboard.KeyPress(keyCodes); } - catch (InvalidOperationException) { } + Safe(() => simulator.Keyboard.KeyPress(keyCodes)); } public void KeyPress(VirtualKeyCode modifierKey, params VirtualKeyCode[] keyCodes) { - try { simulator.Keyboard.ModifiedKeyStroke(modifierKey, keyCodes); } - catch (InvalidOperationException) { } + Safe(() => simulator.Keyboard.ModifiedKeyStroke(modifierKey, keyCodes)); } public void KeyPress(IEnumerable modifierKeys, params VirtualKeyCode[] keyCodes) { - try { simulator.Keyboard.ModifiedKeyStroke(modifierKeys, keyCodes); } - catch (InvalidOperationException) { } + Safe(() => simulator.Keyboard.ModifiedKeyStroke(modifierKeys, keyCodes)); } } } diff --git a/SteamController/Devices/MouseController.cs b/SteamController/Devices/MouseController.cs index 4364f0f..ed08a05 100644 --- a/SteamController/Devices/MouseController.cs +++ b/SteamController/Devices/MouseController.cs @@ -1,5 +1,4 @@ using WindowsInput; -using static CommonHelpers.Log; namespace SteamController.Devices { @@ -77,14 +76,17 @@ namespace SteamController.Devices { } - private void Safe(Func action) + private void Safe(Action action) { try { action(); + + Managers.SASManager.Valid = true; } catch (InvalidOperationException) { + Managers.SASManager.Valid = false; } } @@ -103,67 +105,55 @@ namespace SteamController.Devices // Mouse Up: it is missing now foreach (var button in lastMouseButtons.Except(mouseButtons)) { - Safe(() => + switch (button) { - switch (button) - { - case Button.Left: - simulator.Mouse.LeftButtonUp(); - return true; + case Button.Left: + Safe(() => simulator.Mouse.LeftButtonUp()); + break; - case Button.Right: - simulator.Mouse.RightButtonUp(); - return true; + case Button.Right: + Safe(() => simulator.Mouse.RightButtonUp()); + break; - case Button.Middle: - simulator.Mouse.MiddleButtonUp(); - return true; + case Button.Middle: + Safe(() => simulator.Mouse.MiddleButtonUp()); + break; - case Button.X: - simulator.Mouse.XButtonUp(XButtonID); - return true; + case Button.X: + Safe(() => simulator.Mouse.XButtonUp(XButtonID)); + break; - case Button.Y: - simulator.Mouse.XButtonUp(YButtonID); - return true; - - default: - return false; - } - }); + case Button.Y: + Safe(() => simulator.Mouse.XButtonUp(YButtonID)); + break; + } } // Key Down: new keys being down foreach (var button in mouseButtons.Except(lastMouseButtons)) { - Safe(() => + switch (button) { - switch (button) - { - case Button.Left: - simulator.Mouse.LeftButtonDown(); - return true; + case Button.Left: + Safe(() => simulator.Mouse.LeftButtonDown()); + break; - case Button.Right: - simulator.Mouse.RightButtonDown(); - return true; + case Button.Right: + Safe(() => simulator.Mouse.RightButtonDown()); + break; - case Button.Middle: - simulator.Mouse.MiddleButtonDown(); - return true; + case Button.Middle: + Safe(() => simulator.Mouse.MiddleButtonDown()); + break; - case Button.X: - simulator.Mouse.XButtonDown(XButtonID); - return true; + case Button.X: + Safe(() => simulator.Mouse.XButtonDown(XButtonID)); + break; - case Button.Y: - simulator.Mouse.XButtonDown(YButtonID); - return true; - - default: - return false; - } - }); + case Button.Y: + Safe(() => simulator.Mouse.XButtonDown(YButtonID)); + break; + } } // Move cursor @@ -173,11 +163,7 @@ namespace SteamController.Devices int y = movedY.Consume(); if (x != 0 || y != 0) { - Safe(() => - { - simulator.Mouse.MoveMouseBy(x, y); - return true; - }); + Safe(() => simulator.Mouse.MoveMouseBy(x, y)); } } @@ -187,11 +173,7 @@ namespace SteamController.Devices int value = verticalScroll.Consume(); if (value != 0) { - Safe(() => - { - simulator.Mouse.VerticalScroll(value); - return true; - }); + Safe(() => simulator.Mouse.VerticalScroll(value)); } } @@ -200,77 +182,61 @@ namespace SteamController.Devices int value = horizontalScroll.Consume(); if (value != 0) { - Safe(() => - { - simulator.Mouse.HorizontalScroll(value); - return true; - }); + Safe(() => simulator.Mouse.HorizontalScroll(value)); } } } public void MouseClick(Button button) { - Safe(() => + switch (button) { - switch (button) - { - case Button.Left: - simulator.Mouse.LeftButtonClick(); - return true; + case Button.Left: + Safe(() => simulator.Mouse.LeftButtonClick()); + break; - case Button.Right: - simulator.Mouse.RightButtonClick(); - return true; + case Button.Right: + Safe(() => simulator.Mouse.RightButtonClick()); + break; - case Button.Middle: - simulator.Mouse.MiddleButtonClick(); - return true; + case Button.Middle: + Safe(() => simulator.Mouse.MiddleButtonClick()); + break; - case Button.X: - simulator.Mouse.XButtonClick(XButtonID); - return true; + case Button.X: + Safe(() => simulator.Mouse.XButtonClick(XButtonID)); + break; - case Button.Y: - simulator.Mouse.XButtonClick(YButtonID); - return true; - - default: - return false; - } - }); + case Button.Y: + Safe(() => simulator.Mouse.XButtonClick(YButtonID)); + break; + } } public void MouseDoubleClick(Button button) { - Safe(() => + switch (button) { - switch (button) - { - case Button.Left: - simulator.Mouse.LeftButtonDoubleClick(); - return true; + case Button.Left: + Safe(() => simulator.Mouse.LeftButtonDoubleClick()); + break; - case Button.Right: - simulator.Mouse.RightButtonDoubleClick(); - return true; + case Button.Right: + Safe(() => simulator.Mouse.RightButtonDoubleClick()); + break; - case Button.Middle: - simulator.Mouse.MiddleButtonDoubleClick(); - return true; + case Button.Middle: + Safe(() => simulator.Mouse.MiddleButtonDoubleClick()); + break; - case Button.X: - simulator.Mouse.XButtonDoubleClick(XButtonID); - return true; + case Button.X: + Safe(() => simulator.Mouse.XButtonDoubleClick(XButtonID)); + break; - case Button.Y: - simulator.Mouse.XButtonDoubleClick(YButtonID); - return true; - - default: - return false; - } - }); + case Button.Y: + Safe(() => simulator.Mouse.XButtonDoubleClick(YButtonID)); + break; + } } public void MoveBy(double pixelDeltaX, double pixelDeltaY) @@ -281,11 +247,7 @@ namespace SteamController.Devices public void MoveTo(double absoluteX, double absoluteY) { - Safe(() => - { - simulator.Mouse.MoveMouseTo(absoluteX, absoluteY); - return true; - }); + Safe(() => simulator.Mouse.MoveMouseTo(absoluteX, absoluteY)); } public void VerticalScroll(double scrollAmountInClicks) diff --git a/SteamController/Managers/SASManager.cs b/SteamController/Managers/SASManager.cs index 74fe3e8..6339e26 100644 --- a/SteamController/Managers/SASManager.cs +++ b/SteamController/Managers/SASManager.cs @@ -1,13 +1,25 @@ using System.Diagnostics; +using System.Runtime.InteropServices; using SteamController.Helpers; namespace SteamController.Managers { public sealed class SASManager : Manager { + internal static bool Valid { get; set; } + public override void Tick(Context context) { - context.KeyboardMouseValid = ForegroundProcess.Find() is not null; + Valid = GetCursorPos(out var _); } + + [StructLayout(LayoutKind.Sequential)] + private struct POINT + { + public int X, Y; + } + + [DllImport("user32.dll")] + private static extern bool GetCursorPos(out POINT lpPoint); } }