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
|
@ -37,11 +37,15 @@
|
||||||
<setting file="file://$PROJECT_DIR$/SlidePresenter/Program.cs" root0="FORCE_HIGHLIGHTING" />
|
<setting file="file://$PROJECT_DIR$/SlidePresenter/Program.cs" root0="FORCE_HIGHLIGHTING" />
|
||||||
</component>
|
</component>
|
||||||
<component name="MetaFilesCheckinStateConfiguration" checkMetaFiles="true" />
|
<component name="MetaFilesCheckinStateConfiguration" checkMetaFiles="true" />
|
||||||
|
<component name="ProblemsViewState">
|
||||||
|
<option name="selectedTabId" value="Toolset" />
|
||||||
|
</component>
|
||||||
<component name="ProjectColorInfo">{
|
<component name="ProjectColorInfo">{
|
||||||
"associatedIndex": 6
|
"associatedIndex": 6
|
||||||
}</component>
|
}</component>
|
||||||
<component name="ProjectId" id="2htCW7BWCLo4IJC4dn1HIEGkg1I" />
|
<component name="ProjectId" id="2htCW7BWCLo4IJC4dn1HIEGkg1I" />
|
||||||
<component name="ProjectLevelVcsManager" settingsEditedManually="true">
|
<component name="ProjectLevelVcsManager" settingsEditedManually="true">
|
||||||
|
<OptionsSetting value="false" id="Update" />
|
||||||
<ConfirmationsSetting value="2" id="Add" />
|
<ConfirmationsSetting value="2" id="Add" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectViewState">
|
<component name="ProjectViewState">
|
||||||
|
|
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 SwitchSlidePresenter.InputSender;
|
||||||
using Win32Api;
|
|
||||||
|
|
||||||
namespace SwitchSlidePresenter;
|
namespace SwitchSlidePresenter;
|
||||||
|
|
||||||
public class SlideSwitcher : IDisposable {
|
public class SlideSwitcher : IDisposable {
|
||||||
private readonly IGamepadReader? _reader;
|
private readonly IGamepadReader? _reader;
|
||||||
|
private readonly IInputSender _inputSender = new WindowsInputSender();
|
||||||
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 SlideSwitcher(IGamepadReader? reader) {
|
public SlideSwitcher(IGamepadReader? reader) {
|
||||||
_reader = reader;
|
_reader = reader;
|
||||||
|
@ -23,43 +17,6 @@ public class SlideSwitcher : IDisposable {
|
||||||
_reader.PrevSlide -= PreviousSlide;
|
_reader.PrevSlide -= PreviousSlide;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void NextSlide() {
|
private void NextSlide() => _inputSender.NextSlide();
|
||||||
SimulateKeyPress(VK_NEXT);
|
private void PreviousSlide() => _inputSender.PreviousSlide();
|
||||||
}
|
|
||||||
|
|
||||||
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)));
|
|
||||||
}
|
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue