Depend on GetCursorPos to detect SAS

This commit is contained in:
Kamil Trzciński 2022-12-10 17:00:09 +01:00
parent d05cd2acd3
commit 275ce48509
6 changed files with 118 additions and 133 deletions

View file

@ -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`

View file

@ -41,7 +41,6 @@ namespace SteamController
}
public bool RequestEnable { get; set; } = true;
public bool KeyboardMouseValid { get; set; } = true;
public ContextState State;
public event Action<Profiles.Profile> ProfileChanged;
@ -52,6 +51,11 @@ namespace SteamController
get { return RequestEnable; }
}
public bool KeyboardMouseValid
{
get { return SteamController.Managers.SASManager.Valid; }
}
public Profiles.Profile? CurrentProfile
{
get

View file

@ -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)
{

View file

@ -86,20 +86,32 @@ namespace SteamController.Devices
keyCodes = new Dictionary<VirtualKeyCode, DateTime>();
}
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<VirtualKeyCode> modifierKeys, params VirtualKeyCode[] keyCodes)
{
try { simulator.Keyboard.ModifiedKeyStroke(modifierKeys, keyCodes); }
catch (InvalidOperationException) { }
Safe(() => simulator.Keyboard.ModifiedKeyStroke(modifierKeys, keyCodes));
}
}
}

View file

@ -1,5 +1,4 @@
using WindowsInput;
using static CommonHelpers.Log;
namespace SteamController.Devices
{
@ -77,14 +76,17 @@ namespace SteamController.Devices
{
}
private void Safe(Func<bool> 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)

View file

@ -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);
}
}