refactor: extract input sender to an interface for multiple platform support
This commit is contained in:
parent
184f78123a
commit
1e6f8c0b9f
4 changed files with 61 additions and 47 deletions
6
SlidePresenter/InputSender/IInputSender.cs
Normal file
6
SlidePresenter/InputSender/IInputSender.cs
Normal file
|
@ -0,0 +1,6 @@
|
|||
namespace SwitchSlidePresenter.InputSender;
|
||||
|
||||
public interface IInputSender {
|
||||
void NextSlide();
|
||||
void PreviousSlide();
|
||||
}
|
47
SlidePresenter/InputSender/WindowsInputSender.cs
Normal file
47
SlidePresenter/InputSender/WindowsInputSender.cs
Normal file
|
@ -0,0 +1,47 @@
|
|||
using System.Runtime.InteropServices;
|
||||
using Win32Api;
|
||||
|
||||
namespace SwitchSlidePresenter.InputSender;
|
||||
|
||||
public class WindowsInputSender : IInputSender {
|
||||
private const uint INPUT_KEYBOARD = 1;
|
||||
private const ushort VK_NEXT = 0x22;
|
||||
private const ushort VK_PRIOR = 0x21;
|
||||
private const uint KEYEVENTF_KEYDOWN = 0x0000;
|
||||
private const uint KEYEVENTF_KEYUP = 0x0002;
|
||||
|
||||
public void NextSlide() => SimulateKeyPress(VK_NEXT);
|
||||
public void PreviousSlide() => SimulateKeyPress(VK_PRIOR);
|
||||
|
||||
private static void SimulateKeyPress(ushort keyCode) {
|
||||
Input[] inputs = new Input[2];
|
||||
|
||||
inputs[0] = new Input {
|
||||
type = INPUT_KEYBOARD,
|
||||
u = new InputUnion {
|
||||
ki = new KeyboardInput {
|
||||
wVk = keyCode,
|
||||
wScan = 0,
|
||||
dwFlags = KEYEVENTF_KEYDOWN,
|
||||
time = 0,
|
||||
dwExtraInfo = IntPtr.Zero
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
inputs[1] = new Input {
|
||||
type = INPUT_KEYBOARD,
|
||||
u = new InputUnion {
|
||||
ki = new KeyboardInput {
|
||||
wVk = keyCode,
|
||||
wScan = 0,
|
||||
dwFlags = KEYEVENTF_KEYUP,
|
||||
time = 0,
|
||||
dwExtraInfo = IntPtr.Zero
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Win32Api.Win32Api.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(Input)));
|
||||
}
|
||||
}
|
|
@ -1,16 +1,10 @@
|
|||
using System.Runtime.InteropServices;
|
||||
using Win32Api;
|
||||
using SwitchSlidePresenter.InputSender;
|
||||
|
||||
namespace SwitchSlidePresenter;
|
||||
|
||||
public class SlideSwitcher : IDisposable {
|
||||
private readonly IGamepadReader? _reader;
|
||||
|
||||
private const uint INPUT_KEYBOARD = 1;
|
||||
private const ushort VK_NEXT = 0x22;
|
||||
private const ushort VK_PRIOR = 0x21;
|
||||
private const uint KEYEVENTF_KEYDOWN = 0x0000;
|
||||
private const uint KEYEVENTF_KEYUP = 0x0002;
|
||||
private readonly IInputSender _inputSender = new WindowsInputSender();
|
||||
|
||||
public SlideSwitcher(IGamepadReader? reader) {
|
||||
_reader = reader;
|
||||
|
@ -23,43 +17,6 @@ public class SlideSwitcher : IDisposable {
|
|||
_reader.PrevSlide -= PreviousSlide;
|
||||
}
|
||||
|
||||
private static void NextSlide() {
|
||||
SimulateKeyPress(VK_NEXT);
|
||||
}
|
||||
|
||||
private static void PreviousSlide() {
|
||||
SimulateKeyPress(VK_PRIOR);
|
||||
}
|
||||
|
||||
private static void SimulateKeyPress(ushort keyCode) {
|
||||
Input[] inputs = new Input[2];
|
||||
|
||||
inputs[0] = new Input {
|
||||
type = INPUT_KEYBOARD,
|
||||
u = new InputUnion {
|
||||
ki = new KeyboardInput {
|
||||
wVk = keyCode,
|
||||
wScan = 0,
|
||||
dwFlags = KEYEVENTF_KEYDOWN,
|
||||
time = 0,
|
||||
dwExtraInfo = IntPtr.Zero
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
inputs[1] = new Input {
|
||||
type = INPUT_KEYBOARD,
|
||||
u = new InputUnion {
|
||||
ki = new KeyboardInput {
|
||||
wVk = keyCode,
|
||||
wScan = 0,
|
||||
dwFlags = KEYEVENTF_KEYUP,
|
||||
time = 0,
|
||||
dwExtraInfo = IntPtr.Zero
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Win32Api.Win32Api.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(Input)));
|
||||
}
|
||||
private void NextSlide() => _inputSender.NextSlide();
|
||||
private void PreviousSlide() => _inputSender.PreviousSlide();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue