Open malhotraprateek opened 6 years ago
@malhotraprateek are you trying to get all system input or only input within your application window?
@kowalej Hi, I was trying to create a Vulkan demo application. It think it was intended to be a windowed application and did not capture all system input. It has been sometime now, so I may not remember correctly.
My purposes were capturing all input inside and outside the focused window but perhaps this may help you:
Set flags RIDEV_INPUTSINK | RIDEV_DEVNOTIFY and for hWnd give it the handle to your applications window.
Read more about the flags and such here: https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagrawinputdevice
The issue I observed was that the lpb
byte array was declared to have a size of 40 but the OS was returning 48 instead.
I believe the correct size can be determined by calling GetRawInputData
with nullptr
for the third parameter and does not need to be hard-coded.
(See references)
Does the size of input data buffer depend upon RIDEV_
* flags?
References: MS Documentation This blog post This stack-overflow question has some more useful info.
I want to work with raw input (windows) and thought this library was a good fit for me. I tried to modify the listener example to use raw input but was not able to do so.
Steps to reproduce:
Build the project for x64 (I used VS2017 Community)
Change the following code snippet in listenersample.cpp:
manager.CreateDevice<gainput::InputDeviceKeyboard>(gainput::InputDevice::DV_RAW);
const gainput::DeviceId keyboardId = manager.CreateDevice<gainput::InputDeviceKeyboard>();
manager.CreateDevice<gainput::InputDeviceMouse>(gainput::InputDevice::DV_RAW);
const gainput::DeviceId mouseId = manager.CreateDevice<gainput::InputDeviceMouse>();
manager.CreateDevice<gainput::InputDevicePad>();
manager.CreateDevice<gainput::InputDevicePad>();
manager.CreateDevice<gainput::InputDeviceTouch>();
toconst gainput::DeviceId keyboardId = manager.CreateDevice<gainput::InputDeviceKeyboard>(gainput::InputDevice::AutoIndex, gainput::InputDevice::DV_RAW);
//manager.CreateDevice<gainput::InputDeviceKeyboard>();
const gainput::DeviceId mouseId = manager.CreateDevice<gainput::InputDeviceMouse>(gainput::InputDevice::AutoIndex, gainput::InputDevice::DV_RAW);
//manager.CreateDevice<gainput::InputDeviceMouse>();
//manager.CreateDevice<gainput::InputDevicePad>();
//manager.CreateDevice<gainput::InputDevicePad>();
//manager.CreateDevice<gainput::InputDeviceTouch>();
Run the sample project
Observe that there is no mouse input being reported
Potential solution:
I believe that the problem lies in how the library gets the raw input data in GainputInputDeviceMouseWinRaw.h and GainputInputDeviceKeyboardWinRaw.h
For x64
dwSize
variable must be 48 instead of 40. A better way would be to get the size needed from the system itself.Check the revisions of this gist.
NOTE: I have used C++ 11 features (shared_ptr) for my modifications.
Kindly let me know if you need anything more from my side