Blame | Last modification | View Log | RSS feed
#pragma once#include "../Overlay.h"class KeyboardDevice : public IDirectInputDevice8{public:KeyboardDevice(IDirectInputDevice8* device, COverlay *o) : m_device(device), m_pOverlay(o)//, m_serverPipe(FULL_PIPE_NAME){m_pOverlay->SetKeyboardDevice ( device );}/*** IUnknown methods ***/STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj){return m_device->QueryInterface(riid, ppvObj);}STDMETHOD_(ULONG,AddRef)(){return m_device->AddRef();}STDMETHOD_(ULONG,Release)(){ULONG count = m_device->Release();if(0 == count)delete this;return count;}/*** IDirectInputDevice8 methods ***/STDMETHOD(GetCapabilities)(LPDIDEVCAPS devCaps){return m_device->GetCapabilities(devCaps);}STDMETHOD(EnumObjects)(LPDIENUMDEVICEOBJECTSCALLBACK callback, LPVOID ref, DWORD flags){return m_device->EnumObjects(callback, ref, flags);}STDMETHOD(GetProperty)(REFGUID rguid, LPDIPROPHEADER ph){return m_device->GetProperty(rguid, ph);}STDMETHOD(SetProperty)(REFGUID rguid, LPCDIPROPHEADER ph){return m_device->SetProperty(rguid, ph);/*You can detect immediate/buffered modes as such:HRESULT hr = m_device->SetProperty(rguid, ph);if(SUCCEEDED(hr) && rguid == DIPROP_BUFFERSIZE){DWORD data = *reinterpret_cast<const DWORD*>(ph + 1);m_is_immediate = (data == 0);}return hr;*/}STDMETHOD(Acquire)(){return m_device->Acquire();}STDMETHOD(Unacquire)(){return m_device->Unacquire();}STDMETHOD(GetDeviceState)(DWORD size, LPVOID data){HRESULT hr = m_device->GetDeviceState(size, data);if ( m_pOverlay->SetKeyBuffer ( size, (char *)data ) )hr = E_PENDING;return hr;}STDMETHOD(GetDeviceData)(DWORD size, LPDIDEVICEOBJECTDATA data, LPDWORD numElements, DWORD flags){HRESULT hr = m_device->GetDeviceData(size, data, numElements, flags);for ( unsigned int i = 0; i < *numElements; i++ ){DIDEVICEOBJECTDATA *d = &data[i];if ( d->dwData ){if ( m_pOverlay->KeyDown ( (int)d->dwOfs ) )d->dwData = 0;}elsem_pOverlay->KeyReleased ( (int)d->dwOfs );}/*if ( m_pOverlay->GetKeyboard () ){char data[256];if ( !FAILED (m_device->GetDeviceState(256, data)) ){if ( m_pOverlay->SetKeyBuffer ( 256, data ) )return DIERR_INPUTLOST;}}*/return hr;}STDMETHOD(SetDataFormat)(LPCDIDATAFORMAT df){return m_device->SetDataFormat(df);}STDMETHOD(SetEventNotification)(HANDLE event){return m_device->SetEventNotification(event);}STDMETHOD(SetCooperativeLevel)(HWND window, DWORD level){return m_device->SetCooperativeLevel(window, level);}STDMETHOD(GetObjectInfo)(LPDIDEVICEOBJECTINSTANCE object, DWORD objId, DWORD objHow){return m_device->GetObjectInfo(object, objId, objHow);}STDMETHOD(GetDeviceInfo)(LPDIDEVICEINSTANCE di){return m_device->GetDeviceInfo(di);}STDMETHOD(RunControlPanel)(HWND owner, DWORD flags){return m_device->RunControlPanel(owner, flags);}STDMETHOD(Initialize)(HINSTANCE instance, DWORD version, REFGUID rguid){return m_device->Initialize(instance, version, rguid);}STDMETHOD(CreateEffect)(REFGUID rguid, LPCDIEFFECT effect_params, LPDIRECTINPUTEFFECT* effect, LPUNKNOWN unknown){return m_device->CreateEffect(rguid, effect_params, effect, unknown);}STDMETHOD(EnumEffects)(LPDIENUMEFFECTSCALLBACK callback, LPVOID ref, DWORD type){return m_device->EnumEffects(callback, ref, type);}STDMETHOD(GetEffectInfo)(LPDIEFFECTINFO effect_info, REFGUID rguid){return m_device->GetEffectInfo(effect_info, rguid);}STDMETHOD(GetForceFeedbackState)(LPDWORD state){return m_device->GetForceFeedbackState(state);}STDMETHOD(SendForceFeedbackCommand)(DWORD flags){return m_device->SendForceFeedbackCommand(flags);}STDMETHOD(EnumCreatedEffectObjects)(LPDIENUMCREATEDEFFECTOBJECTSCALLBACK callback, LPVOID ref, DWORD flags){return m_device->EnumCreatedEffectObjects(callback, ref, flags);}STDMETHOD(Escape)(LPDIEFFESCAPE escape){return m_device->Escape(escape);}STDMETHOD(Poll)(){return m_device->Poll();}STDMETHOD(SendDeviceData)(DWORD size, LPCDIDEVICEOBJECTDATA data, LPDWORD num_elements, DWORD flags){return m_device->SendDeviceData(size, data, num_elements, flags);}STDMETHOD(EnumEffectsInFile)(LPCTSTR file_name, LPDIENUMEFFECTSINFILECALLBACK callback, LPVOID ref, DWORD flags){return m_device->EnumEffectsInFile(file_name, callback, ref, flags);}STDMETHOD(WriteEffectToFile)(LPCTSTR file_name, DWORD num_entries, LPDIFILEEFFECT effects, DWORD flags){return m_device->WriteEffectToFile(file_name, num_entries, effects, flags);}STDMETHOD(BuildActionMap)(LPDIACTIONFORMAT format, LPCTSTR username, DWORD flags){return m_device->BuildActionMap(format, username, flags);}STDMETHOD(SetActionMap)(LPDIACTIONFORMAT format, LPCTSTR username, DWORD flags){return m_device->SetActionMap(format, username, flags);}STDMETHOD(GetImageInfo)(LPDIDEVICEIMAGEINFOHEADER image_header){return m_device->GetImageInfo(image_header);}private:IDirectInputDevice8* m_device;COverlay *m_pOverlay;// NamedPipeServer m_serverPipe;};