| 11 | cycrow | 1 | #pragma once
 | 
        
           |  |  | 2 |   | 
        
           |  |  | 3 | #include "../Overlay.h"
 | 
        
           |  |  | 4 |   | 
        
           |  |  | 5 | class KeyboardDevice : public IDirectInputDevice8
 | 
        
           |  |  | 6 | {
 | 
        
           |  |  | 7 | public:
 | 
        
           |  |  | 8 | 	KeyboardDevice(IDirectInputDevice8* device, COverlay *o) : m_device(device), m_pOverlay(o)//, m_serverPipe(FULL_PIPE_NAME)
 | 
        
           |  |  | 9 | 	{
 | 
        
           |  |  | 10 | 		m_pOverlay->SetKeyboardDevice ( device );
 | 
        
           |  |  | 11 | 	}
 | 
        
           |  |  | 12 |   | 
        
           |  |  | 13 | 	/*** IUnknown methods ***/
 | 
        
           |  |  | 14 | 	STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj)
 | 
        
           |  |  | 15 | 	{
 | 
        
           |  |  | 16 | 		return m_device->QueryInterface(riid, ppvObj);
 | 
        
           |  |  | 17 | 	}
 | 
        
           |  |  | 18 |   | 
        
           |  |  | 19 | 	STDMETHOD_(ULONG,AddRef)()
 | 
        
           |  |  | 20 | 	{
 | 
        
           |  |  | 21 | 		return m_device->AddRef();
 | 
        
           |  |  | 22 | 	}
 | 
        
           |  |  | 23 |   | 
        
           |  |  | 24 | 	STDMETHOD_(ULONG,Release)()
 | 
        
           |  |  | 25 | 	{
 | 
        
           |  |  | 26 | 		ULONG count = m_device->Release();
 | 
        
           |  |  | 27 | 		if(0 == count)
 | 
        
           |  |  | 28 | 			delete this;
 | 
        
           |  |  | 29 |   | 
        
           |  |  | 30 | 		return count;
 | 
        
           |  |  | 31 | 	}
 | 
        
           |  |  | 32 |   | 
        
           |  |  | 33 | 	/*** IDirectInputDevice8 methods ***/
 | 
        
           |  |  | 34 | 	STDMETHOD(GetCapabilities)(LPDIDEVCAPS devCaps)
 | 
        
           |  |  | 35 | 	{
 | 
        
           |  |  | 36 | 		return m_device->GetCapabilities(devCaps);
 | 
        
           |  |  | 37 | 	}
 | 
        
           |  |  | 38 |   | 
        
           |  |  | 39 | 	STDMETHOD(EnumObjects)(LPDIENUMDEVICEOBJECTSCALLBACK callback, LPVOID ref, DWORD flags)	
 | 
        
           |  |  | 40 | 	{
 | 
        
           |  |  | 41 | 		return m_device->EnumObjects(callback, ref, flags);
 | 
        
           |  |  | 42 | 	}
 | 
        
           |  |  | 43 |   | 
        
           |  |  | 44 | 	STDMETHOD(GetProperty)(REFGUID rguid, LPDIPROPHEADER ph)
 | 
        
           |  |  | 45 | 	{
 | 
        
           |  |  | 46 | 		return m_device->GetProperty(rguid, ph);
 | 
        
           |  |  | 47 | 	}
 | 
        
           |  |  | 48 |   | 
        
           |  |  | 49 | 	STDMETHOD(SetProperty)(REFGUID rguid, LPCDIPROPHEADER ph)
 | 
        
           |  |  | 50 | 	{
 | 
        
           |  |  | 51 | 		return m_device->SetProperty(rguid, ph);
 | 
        
           |  |  | 52 |   | 
        
           |  |  | 53 | 		/*
 | 
        
           |  |  | 54 | 		You can detect immediate/buffered modes as such:
 | 
        
           |  |  | 55 |   | 
        
           |  |  | 56 | 		HRESULT hr = m_device->SetProperty(rguid, ph);
 | 
        
           |  |  | 57 |   | 
        
           |  |  | 58 | 		if(SUCCEEDED(hr) && rguid == DIPROP_BUFFERSIZE)
 | 
        
           |  |  | 59 | 		{
 | 
        
           |  |  | 60 | 			DWORD data = *reinterpret_cast<const DWORD*>(ph + 1);
 | 
        
           |  |  | 61 | 			m_is_immediate = (data == 0);
 | 
        
           |  |  | 62 | 		}
 | 
        
           |  |  | 63 |   | 
        
           |  |  | 64 | 		return hr;
 | 
        
           |  |  | 65 | 		*/
 | 
        
           |  |  | 66 | 	}
 | 
        
           |  |  | 67 |   | 
        
           |  |  | 68 | 	STDMETHOD(Acquire)()
 | 
        
           |  |  | 69 | 	{
 | 
        
           |  |  | 70 | 		return m_device->Acquire();
 | 
        
           |  |  | 71 | 	}
 | 
        
           |  |  | 72 |   | 
        
           |  |  | 73 | 	STDMETHOD(Unacquire)()
 | 
        
           |  |  | 74 | 	{
 | 
        
           |  |  | 75 | 		return m_device->Unacquire();
 | 
        
           |  |  | 76 | 	}
 | 
        
           |  |  | 77 |   | 
        
           |  |  | 78 | 	STDMETHOD(GetDeviceState)(DWORD size, LPVOID data)
 | 
        
           |  |  | 79 | 	{
 | 
        
           |  |  | 80 | 		HRESULT hr = m_device->GetDeviceState(size, data);
 | 
        
           |  |  | 81 |   | 
        
           |  |  | 82 | 		if ( m_pOverlay->SetKeyBuffer ( size, (char *)data ) )
 | 
        
           |  |  | 83 | 			hr = E_PENDING;
 | 
        
           |  |  | 84 |   | 
        
           |  |  | 85 | 		return hr;
 | 
        
           |  |  | 86 | 	}
 | 
        
           |  |  | 87 |   | 
        
           |  |  | 88 | 	STDMETHOD(GetDeviceData)(DWORD size, LPDIDEVICEOBJECTDATA data, LPDWORD numElements, DWORD flags)
 | 
        
           |  |  | 89 | 	{
 | 
        
           |  |  | 90 | 		HRESULT hr = m_device->GetDeviceData(size, data, numElements, flags);
 | 
        
           |  |  | 91 |   | 
        
           |  |  | 92 | 		for ( unsigned int i = 0; i < *numElements; i++ )
 | 
        
           |  |  | 93 | 		{
 | 
        
           |  |  | 94 | 			DIDEVICEOBJECTDATA *d = &data[i];
 | 
        
           |  |  | 95 | 			if ( d->dwData )
 | 
        
           |  |  | 96 | 			{
 | 
        
           |  |  | 97 | 				if ( m_pOverlay->KeyDown ( (int)d->dwOfs ) )
 | 
        
           |  |  | 98 | 					d->dwData = 0;
 | 
        
           |  |  | 99 | 			}
 | 
        
           |  |  | 100 | 			else
 | 
        
           |  |  | 101 | 				m_pOverlay->KeyReleased ( (int)d->dwOfs );
 | 
        
           |  |  | 102 | 		}
 | 
        
           |  |  | 103 | /*
 | 
        
           |  |  | 104 | 		if ( m_pOverlay->GetKeyboard () )
 | 
        
           |  |  | 105 | 		{
 | 
        
           |  |  | 106 | 			char data[256];
 | 
        
           |  |  | 107 | 			if ( !FAILED (m_device->GetDeviceState(256, data)) )
 | 
        
           |  |  | 108 | 			{
 | 
        
           |  |  | 109 | 				if ( m_pOverlay->SetKeyBuffer ( 256, data ) )
 | 
        
           |  |  | 110 | 					return DIERR_INPUTLOST;
 | 
        
           |  |  | 111 | 			}
 | 
        
           |  |  | 112 | 		}*/
 | 
        
           |  |  | 113 | 		return hr;
 | 
        
           |  |  | 114 | 	}
 | 
        
           |  |  | 115 |   | 
        
           |  |  | 116 | 	STDMETHOD(SetDataFormat)(LPCDIDATAFORMAT df)
 | 
        
           |  |  | 117 | 	{
 | 
        
           |  |  | 118 | 		return m_device->SetDataFormat(df);
 | 
        
           |  |  | 119 | 	}
 | 
        
           |  |  | 120 |   | 
        
           |  |  | 121 | 	STDMETHOD(SetEventNotification)(HANDLE event)
 | 
        
           |  |  | 122 | 	{
 | 
        
           |  |  | 123 | 		return m_device->SetEventNotification(event);
 | 
        
           |  |  | 124 | 	}
 | 
        
           |  |  | 125 |   | 
        
           |  |  | 126 | 	STDMETHOD(SetCooperativeLevel)(HWND window, DWORD level)
 | 
        
           |  |  | 127 | 	{
 | 
        
           |  |  | 128 | 		return m_device->SetCooperativeLevel(window, level);
 | 
        
           |  |  | 129 | 	}
 | 
        
           |  |  | 130 |   | 
        
           |  |  | 131 | 	STDMETHOD(GetObjectInfo)(LPDIDEVICEOBJECTINSTANCE object, DWORD objId, DWORD objHow)
 | 
        
           |  |  | 132 | 	{
 | 
        
           |  |  | 133 | 		return m_device->GetObjectInfo(object, objId, objHow);
 | 
        
           |  |  | 134 | 	}
 | 
        
           |  |  | 135 |   | 
        
           |  |  | 136 | 	STDMETHOD(GetDeviceInfo)(LPDIDEVICEINSTANCE di)
 | 
        
           |  |  | 137 | 	{
 | 
        
           |  |  | 138 | 		return m_device->GetDeviceInfo(di);
 | 
        
           |  |  | 139 | 	}
 | 
        
           |  |  | 140 |   | 
        
           |  |  | 141 | 	STDMETHOD(RunControlPanel)(HWND owner, DWORD flags)
 | 
        
           |  |  | 142 | 	{
 | 
        
           |  |  | 143 | 		return m_device->RunControlPanel(owner, flags);
 | 
        
           |  |  | 144 | 	}
 | 
        
           |  |  | 145 |   | 
        
           |  |  | 146 | 	STDMETHOD(Initialize)(HINSTANCE instance, DWORD version, REFGUID rguid)
 | 
        
           |  |  | 147 | 	{
 | 
        
           |  |  | 148 | 		return m_device->Initialize(instance, version, rguid);
 | 
        
           |  |  | 149 | 	}
 | 
        
           |  |  | 150 |   | 
        
           |  |  | 151 | 	STDMETHOD(CreateEffect)(REFGUID rguid, LPCDIEFFECT effect_params, LPDIRECTINPUTEFFECT* effect, LPUNKNOWN unknown)
 | 
        
           |  |  | 152 | 	{
 | 
        
           |  |  | 153 | 		return m_device->CreateEffect(rguid, effect_params, effect, unknown);
 | 
        
           |  |  | 154 | 	}
 | 
        
           |  |  | 155 |   | 
        
           |  |  | 156 |     STDMETHOD(EnumEffects)(LPDIENUMEFFECTSCALLBACK callback, LPVOID ref, DWORD type)
 | 
        
           |  |  | 157 | 	{
 | 
        
           |  |  | 158 | 		return m_device->EnumEffects(callback, ref, type);
 | 
        
           |  |  | 159 | 	}
 | 
        
           |  |  | 160 |   | 
        
           |  |  | 161 |     STDMETHOD(GetEffectInfo)(LPDIEFFECTINFO effect_info, REFGUID rguid)
 | 
        
           |  |  | 162 | 	{
 | 
        
           |  |  | 163 | 		return m_device->GetEffectInfo(effect_info, rguid);
 | 
        
           |  |  | 164 | 	}
 | 
        
           |  |  | 165 |   | 
        
           |  |  | 166 |     STDMETHOD(GetForceFeedbackState)(LPDWORD state)
 | 
        
           |  |  | 167 | 	{
 | 
        
           |  |  | 168 | 		return m_device->GetForceFeedbackState(state);
 | 
        
           |  |  | 169 | 	}
 | 
        
           |  |  | 170 |   | 
        
           |  |  | 171 |     STDMETHOD(SendForceFeedbackCommand)(DWORD flags)
 | 
        
           |  |  | 172 | 	{
 | 
        
           |  |  | 173 | 		return m_device->SendForceFeedbackCommand(flags);
 | 
        
           |  |  | 174 | 	}
 | 
        
           |  |  | 175 |   | 
        
           |  |  | 176 |     STDMETHOD(EnumCreatedEffectObjects)(LPDIENUMCREATEDEFFECTOBJECTSCALLBACK callback, LPVOID ref, DWORD flags)
 | 
        
           |  |  | 177 | 	{
 | 
        
           |  |  | 178 | 		return m_device->EnumCreatedEffectObjects(callback, ref, flags);
 | 
        
           |  |  | 179 | 	}
 | 
        
           |  |  | 180 |   | 
        
           |  |  | 181 |     STDMETHOD(Escape)(LPDIEFFESCAPE escape)
 | 
        
           |  |  | 182 | 	{
 | 
        
           |  |  | 183 | 		return m_device->Escape(escape);
 | 
        
           |  |  | 184 | 	}
 | 
        
           |  |  | 185 |   | 
        
           |  |  | 186 |     STDMETHOD(Poll)()
 | 
        
           |  |  | 187 | 	{
 | 
        
           |  |  | 188 | 		return m_device->Poll();
 | 
        
           |  |  | 189 | 	}
 | 
        
           |  |  | 190 |   | 
        
           |  |  | 191 | 	STDMETHOD(SendDeviceData)(DWORD size, LPCDIDEVICEOBJECTDATA data, LPDWORD num_elements, DWORD flags)
 | 
        
           |  |  | 192 | 	{
 | 
        
           |  |  | 193 | 		return m_device->SendDeviceData(size, data, num_elements, flags);
 | 
        
           |  |  | 194 | 	}
 | 
        
           |  |  | 195 |   | 
        
           |  |  | 196 | 	STDMETHOD(EnumEffectsInFile)(LPCTSTR file_name, LPDIENUMEFFECTSINFILECALLBACK callback, LPVOID ref, DWORD flags)
 | 
        
           |  |  | 197 | 	{
 | 
        
           |  |  | 198 | 		return m_device->EnumEffectsInFile(file_name, callback, ref, flags);
 | 
        
           |  |  | 199 | 	}
 | 
        
           |  |  | 200 |   | 
        
           |  |  | 201 |     STDMETHOD(WriteEffectToFile)(LPCTSTR file_name, DWORD num_entries, LPDIFILEEFFECT effects, DWORD flags)
 | 
        
           |  |  | 202 | 	{
 | 
        
           |  |  | 203 | 		return m_device->WriteEffectToFile(file_name, num_entries, effects, flags);
 | 
        
           |  |  | 204 | 	}
 | 
        
           |  |  | 205 |   | 
        
           |  |  | 206 |     STDMETHOD(BuildActionMap)(LPDIACTIONFORMAT format, LPCTSTR username, DWORD flags)
 | 
        
           |  |  | 207 | 	{
 | 
        
           |  |  | 208 | 		return m_device->BuildActionMap(format, username, flags);
 | 
        
           |  |  | 209 | 	}
 | 
        
           |  |  | 210 |   | 
        
           |  |  | 211 |     STDMETHOD(SetActionMap)(LPDIACTIONFORMAT format, LPCTSTR username, DWORD flags)
 | 
        
           |  |  | 212 | 	{
 | 
        
           |  |  | 213 | 		return m_device->SetActionMap(format, username, flags);
 | 
        
           |  |  | 214 | 	}
 | 
        
           |  |  | 215 |   | 
        
           |  |  | 216 |     STDMETHOD(GetImageInfo)(LPDIDEVICEIMAGEINFOHEADER image_header)
 | 
        
           |  |  | 217 | 	{
 | 
        
           |  |  | 218 | 		return m_device->GetImageInfo(image_header);
 | 
        
           |  |  | 219 | 	}
 | 
        
           |  |  | 220 |   | 
        
           |  |  | 221 | private:
 | 
        
           |  |  | 222 | 	IDirectInputDevice8* m_device;	
 | 
        
           |  |  | 223 | 	COverlay *m_pOverlay;
 | 
        
           |  |  | 224 | //	NamedPipeServer m_serverPipe;
 | 
        
           |  |  | 225 | };
 | 
        
           |  |  | 226 |   |