#pragma once #include "Common.h" #include "Core/Shared/Interfaces/IKeyManager.h" #include "Utilities/Timer.h" #include "Utilities/AutoResetEvent.h" #include "XInputManager.h" #include "DirectInputManager.h" #include "Shared/KeyDefinitions.h" class Emulator; class WindowsKeyManager : public IKeyManager { private: static constexpr int BaseDirectInputIndex = 0x2000; HWND _hWnd; Emulator* _emu; vector _keyDefinitions; bool _keyState[0x205]; unique_ptr _directInput; unique_ptr _xInput; unordered_map _keyNames; unordered_map _keyCodes; AutoResetEvent _stopSignal; thread _updateDeviceThread; atomic _stopUpdateDeviceThread = false; bool _disableAllKeys = false; void StartUpdateDeviceThread(); public: WindowsKeyManager(Emulator* emu, HWND hWnd); ~WindowsKeyManager(); void RefreshState() override; bool IsKeyPressed(uint16_t key) override; optional GetAxisPosition(uint16_t key) override; bool IsMouseButtonPressed(MouseButton button) override; vector GetPressedKeys() override; string GetKeyName(uint16_t key) override; uint16_t GetKeyCode(string keyName) override; bool SetKeyState(uint16_t scanCode, bool state) override; void ResetKeyState() override; void SetDisabled(bool disabled) override; void SetForceFeedback(uint16_t magnitude) override; void UpdateDevices() override; };