#pragma once #include "stdafx.h" #include #include "../Core/IKeyManager.h" #include "../Utilities/Timer.h" #include "../Utilities/AutoResetEvent.h" #include "XInputManager.h" #include "DirectInputManager.h" struct KeyDefinition { string name; uint32_t keyCode; string description; string extDescription; }; class Console; class WindowsKeyManager : public IKeyManager { private: HWND _hWnd; shared_ptr _console; bool _keyState[0x200]; bool _mouseState[0x03]; unique_ptr _directInput; unique_ptr _xInput; std::unordered_map _keyNames; std::unordered_map _keyExtendedNames; std::unordered_map _keyCodes; AutoResetEvent _stopSignal; std::thread _updateDeviceThread; atomic _stopUpdateDeviceThread = false; bool _disableAllKeys = false; void StartUpdateDeviceThread(); public: WindowsKeyManager(shared_ptr console, HWND hWnd); ~WindowsKeyManager(); void RefreshState(); bool IsKeyPressed(uint32_t key); bool IsMouseButtonPressed(MouseButton button); vector GetPressedKeys(); string GetKeyName(uint32_t key); uint32_t GetKeyCode(string keyName); void SetKeyState(uint16_t scanCode, bool state); void ResetKeyState(); void SetDisabled(bool disabled); void UpdateDevices(); };