Restrict WM_DEVICECHANGE messages to only be sent when HID devices are affected, restrict DirectInput EnumDevices to only enumerate over attached devices. Fixes #1415

This commit is contained in:
binary1248 2018-04-15 04:22:16 +02:00 committed by Lukas Dürrenberger
parent b922b04b5e
commit ee957f3420
2 changed files with 5 additions and 3 deletions

View File

@ -449,7 +449,7 @@ void JoystickImpl::updateConnectionsDInput()
joystickList[i].plugged = false; joystickList[i].plugged = false;
// Enumerate devices // Enumerate devices
HRESULT result = directInput->EnumDevices(DI8DEVCLASS_GAMECTRL, &JoystickImpl::deviceEnumerationCallback, NULL, DIEDFL_ALLDEVICES); HRESULT result = directInput->EnumDevices(DI8DEVCLASS_GAMECTRL, &JoystickImpl::deviceEnumerationCallback, NULL, DIEDFL_ATTACHEDONLY);
// Remove devices that were not connected during the enumeration // Remove devices that were not connected during the enumeration
for (std::vector<JoystickRecord>::iterator i = joystickList.begin(); i != joystickList.end();) for (std::vector<JoystickRecord>::iterator i = joystickList.begin(); i != joystickList.end();)

View File

@ -67,6 +67,8 @@ namespace
const wchar_t* className = L"SFML_Window"; const wchar_t* className = L"SFML_Window";
sf::priv::WindowImplWin32* fullscreenWindow = NULL; sf::priv::WindowImplWin32* fullscreenWindow = NULL;
const GUID GUID_DEVINTERFACE_HID = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30}};
void setProcessDpiAware() void setProcessDpiAware()
{ {
// Try SetProcessDpiAwareness first // Try SetProcessDpiAwareness first
@ -216,8 +218,8 @@ m_cursorGrabbed (m_fullscreen)
m_handle = CreateWindowW(className, title.toWideString().c_str(), win32Style, left, top, width, height, NULL, NULL, GetModuleHandle(NULL), this); m_handle = CreateWindowW(className, title.toWideString().c_str(), win32Style, left, top, width, height, NULL, NULL, GetModuleHandle(NULL), this);
// Register to receive device interface change notifications (used for joystick connection handling) // Register to receive device interface change notifications (used for joystick connection handling)
DEV_BROADCAST_HDR deviceBroadcastHeader = {sizeof(DEV_BROADCAST_HDR), DBT_DEVTYP_DEVICEINTERFACE, 0}; DEV_BROADCAST_DEVICEINTERFACE deviceInterface = {sizeof(DEV_BROADCAST_DEVICEINTERFACE), DBT_DEVTYP_DEVICEINTERFACE, 0, GUID_DEVINTERFACE_HID, 0};
RegisterDeviceNotification(m_handle, &deviceBroadcastHeader, DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); RegisterDeviceNotification(m_handle, &deviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);
// If we're the first window handle, we only need to poll for joysticks when WM_DEVICECHANGE message is received // If we're the first window handle, we only need to poll for joysticks when WM_DEVICECHANGE message is received
if (m_handle) if (m_handle)