//In morrowind this only got called for keyboards when typing into the console. Probably no point in overriding it //And so it turns out that oblivion uses this whever it's in menumode instead of just consoles. Figures. HRESULT _stdcall GetDeviceData(DWORD a,DIDEVICEOBJECTDATA* b,DWORD* c,DWORD d) { if (bufferedPresses.empty()) return RealDevice->GetDeviceData(a,b,c,d); if(!b) { DWORD temp=*c; HRESULT hr = RealDevice->GetDeviceData(a,b,c,d); if(c) *c=min(bufferedPresses.size(),temp); if(!(d|DIGDD_PEEK)) while(!bufferedPresses.empty()) bufferedPresses.pop(); return hr; } int count=0; while (bufferedPresses.size()) { //Stricktly speaking, should return a buffer overflow by here, but if you do it breaks? //Presumably, if you could mash your keyboard fast enough, no keypresses would register... if(count==*c) return DI_OK; //DI_BUFFEROVERFLOW; //This will not work correctly if DIGDD_PEEK is specified. afaik, it's only ever used if b == NULL *b=bufferedPresses.front(); bufferedPresses.pop(); b+=sizeof(void*); count++; } if(count==*c) return DI_OK; //Can probably just return DI_OK here, because afaik *c is only ever 1 unless oblivion is trying to empty the buffer *c-=count; HRESULT hr=RealDevice->GetDeviceData(a,b,c,d); *c+=count; return hr; }