mirror of
https://github.com/babalae/better-genshin-impact.git
synced 2026-03-15 07:43:20 +08:00
168 lines
3.9 KiB
C#
168 lines
3.9 KiB
C#
using System.Diagnostics;
|
|
|
|
namespace Fischless.KeyboardCapture;
|
|
|
|
[DebuggerDisplay("{result.ToString()}")]
|
|
public class KeyboardReader : IDisposable
|
|
{
|
|
public static KeyboardReader Default { get; } = new();
|
|
|
|
public event EventHandler<KeyboardResult> Received = null!;
|
|
|
|
public bool IsCombinationOnly = false;
|
|
public bool IsCaseSensitived = false;
|
|
protected KeyboardHook KeyboardHook = new();
|
|
protected bool IsShift = false;
|
|
protected bool IsCtrl = false;
|
|
protected bool IsAlt = false;
|
|
protected bool IsWin = false;
|
|
|
|
public KeyboardReader()
|
|
{
|
|
Start();
|
|
}
|
|
|
|
~KeyboardReader()
|
|
{
|
|
Dispose();
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Stop();
|
|
}
|
|
|
|
public void Start()
|
|
{
|
|
KeyboardHook.KeyDown -= OnKeyDown;
|
|
KeyboardHook.KeyDown += OnKeyDown;
|
|
KeyboardHook.KeyUp -= OnKeyUp;
|
|
KeyboardHook.KeyUp += OnKeyUp;
|
|
KeyboardHook.Start();
|
|
}
|
|
|
|
public void Stop()
|
|
{
|
|
KeyboardHook.Stop();
|
|
KeyboardHook.KeyDown -= OnKeyDown;
|
|
KeyboardHook.KeyUp -= OnKeyUp;
|
|
}
|
|
|
|
private void OnKeyDown(object? sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyCode == Keys.Shift
|
|
|| e.KeyCode == Keys.ShiftKey
|
|
|| e.KeyCode == Keys.LShiftKey
|
|
|| e.KeyCode == Keys.RShiftKey)
|
|
{
|
|
IsShift = true;
|
|
if (IsCombinationOnly)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
else if (e.KeyCode == Keys.Control
|
|
|| e.KeyCode == Keys.ControlKey
|
|
|| e.KeyCode == Keys.LControlKey
|
|
|| e.KeyCode == Keys.RControlKey)
|
|
{
|
|
IsCtrl = true;
|
|
if (IsCombinationOnly)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
else if (e.KeyCode == Keys.LWin
|
|
|| e.KeyCode == Keys.RWin)
|
|
{
|
|
IsWin = true;
|
|
if (IsCombinationOnly)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
else if (e.KeyCode == Keys.Alt
|
|
|| e.KeyCode == Keys.LMenu
|
|
|| e.KeyCode == Keys.RMenu)
|
|
{
|
|
IsAlt = true;
|
|
if (IsCombinationOnly)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
var now = DateTime.Now;
|
|
|
|
#if FALSE
|
|
Debug.WriteLine(e.KeyCode);
|
|
#endif
|
|
|
|
KeyboardItem item;
|
|
|
|
if (IsCaseSensitived)
|
|
{
|
|
bool isUpper = Control.IsKeyLocked(Keys.CapsLock) ? !IsShift : IsShift;
|
|
|
|
if (isUpper)
|
|
{
|
|
item = new(now, e.KeyCode, char.ToUpper((char)e.KeyCode).ToString());
|
|
}
|
|
else
|
|
{
|
|
item = new(now, e.KeyCode, char.ToLower((char)e.KeyCode).ToString());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
item = new(now, e.KeyCode);
|
|
}
|
|
|
|
KeyboardResult result = new(item)
|
|
{
|
|
IsShift = IsShift,
|
|
IsCtrl = IsCtrl,
|
|
IsAlt = IsAlt,
|
|
IsWin = IsWin,
|
|
};
|
|
|
|
Received?.Invoke(this, result);
|
|
#if FALSE
|
|
Debug.WriteLine(result.ToString());
|
|
#endif
|
|
}
|
|
|
|
private void OnKeyUp(object? sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyCode == Keys.Shift
|
|
|| e.KeyCode == Keys.ShiftKey
|
|
|| e.KeyCode == Keys.LShiftKey
|
|
|| e.KeyCode == Keys.RShiftKey)
|
|
{
|
|
IsShift = false;
|
|
return;
|
|
}
|
|
else if (e.KeyCode == Keys.Control
|
|
|| e.KeyCode == Keys.ControlKey
|
|
|| e.KeyCode == Keys.LControlKey
|
|
|| e.KeyCode == Keys.RControlKey)
|
|
{
|
|
IsCtrl = false;
|
|
return;
|
|
}
|
|
else if (e.KeyCode == Keys.LWin
|
|
|| e.KeyCode == Keys.RWin)
|
|
{
|
|
IsWin = false;
|
|
return;
|
|
}
|
|
else if (e.KeyCode == Keys.Alt
|
|
|| e.KeyCode == Keys.LMenu
|
|
|| e.KeyCode == Keys.RMenu)
|
|
{
|
|
IsAlt = false;
|
|
return;
|
|
}
|
|
}
|
|
}
|