From c0bb1e4f1cb16be7ab3ebe8690efcef17e8dcb3e Mon Sep 17 00:00:00 2001 From: Dimitriy Ryazantcev Date: Thu, 9 Apr 2020 16:02:57 +0300 Subject: [PATCH] Some changes in DirectInput sample: - Simplified XInput check - you can just get HID path via DIPROP_GUIDANDPATH and check for "_IG" there - Added DirectInput gamepad info printed on UI - Converted docx readme to Github friendly Markdown --- DirectInput/CustomFormat.png | Bin 0 -> 6006 bytes DirectInput/Joystick/joystick.cpp | 257 ++++++++++-------------------- DirectInput/Joystick/joystick.rc | 68 ++++---- DirectInput/Joystick/resource.h | 1 + DirectInput/README.md | 82 ++++++++++ DirectInput/Readme.docx | Bin 38136 -> 0 bytes DirectInput/ffconst.png | Bin 0 -> 3127 bytes DirectInput/joystick.png | Bin 0 -> 13494 bytes 8 files changed, 204 insertions(+), 204 deletions(-) create mode 100644 DirectInput/CustomFormat.png create mode 100644 DirectInput/README.md delete mode 100644 DirectInput/Readme.docx create mode 100644 DirectInput/ffconst.png create mode 100644 DirectInput/joystick.png diff --git a/DirectInput/CustomFormat.png b/DirectInput/CustomFormat.png new file mode 100644 index 0000000000000000000000000000000000000000..acdf43031e2cecca512d4aa2c589b15cde0834a7 GIT binary patch literal 6006 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 -HRESULT SetupForIsXInputDevice(); -bool IsXInputDevice( const GUID* pGuidProductFromDirectInput ); -void CleanupForIsXInputDevice(); - -struct XINPUT_DEVICE_NODE -{ - DWORD dwVidPid; - XINPUT_DEVICE_NODE* pNext; -}; +bool IsXInputDevice( LPDIRECTINPUTDEVICE8 pJoystick ); struct DI_ENUM_CONTEXT { @@ -62,7 +53,6 @@ struct DI_ENUM_CONTEXT }; bool g_bFilterOutXinputDevices = false; -XINPUT_DEVICE_NODE* g_pXInputDeviceList = nullptr; @@ -78,7 +68,6 @@ LPDIRECTINPUTDEVICE8 g_pJoystick = nullptr; - //----------------------------------------------------------------------------- // Name: WinMain() // Desc: Entry point for the application. Since we use a simple dialog for @@ -199,9 +188,6 @@ HRESULT InitDirectInput( HWND hDlg ) return hr; - if( g_bFilterOutXinputDevices ) - SetupForIsXInputDevice(); - DIJOYCONFIG PreferredJoyCfg = {0}; DI_ENUM_CONTEXT enumContext; enumContext.pPreferredJoyCfg = &PreferredJoyCfg; @@ -222,9 +208,6 @@ HRESULT InitDirectInput( HWND hDlg ) &enumContext, DIEDFL_ATTACHEDONLY ) ) ) return hr; - if( g_bFilterOutXinputDevices ) - CleanupForIsXInputDevice(); - // Make sure we got a joystick if( !g_pJoystick ) { @@ -256,169 +239,100 @@ HRESULT InitDirectInput( HWND hDlg ) ( VOID* )hDlg, DIDFT_ALL ) ) ) return hr; + FillJoystickInfo( hDlg ); + return S_OK; } //----------------------------------------------------------------------------- -// Enum each PNP device using WMI and check each device ID to see if it contains -// "IG_" (ex. "VID_045E&PID_028E&IG_00"). If it does, then it's an XInput device -// Unfortunately this information can not be found by just using DirectInput. -// Checking against a VID/PID of 0x028E/0x045E won't find 3rd party or future -// XInput devices. -// -// This function stores the list of xinput devices in a linked list -// at g_pXInputDeviceList, and IsXInputDevice() searchs that linked list +// Returns true if the DirectInput device is also an XInput device. +// Checks if device ID contains "IG_" (ex. "\\?\HID#VID_045E&PID_02A1&IG_00"). +// If it does, then it's an XInput device. //----------------------------------------------------------------------------- -HRESULT SetupForIsXInputDevice() +bool IsXInputDevice( LPDIRECTINPUTDEVICE8 pJoystick ) { - IWbemServices* pIWbemServices = nullptr; - IEnumWbemClassObject* pEnumDevices = nullptr; - IWbemLocator* pIWbemLocator = nullptr; - IWbemClassObject* pDevices[20] = {0}; - BSTR bstrDeviceID = nullptr; - BSTR bstrClassName = nullptr; - BSTR bstrNamespace = nullptr; - DWORD uReturned = 0; - bool bCleanupCOM = false; - UINT iDevice = 0; - VARIANT var; - HRESULT hr; + DIPROPGUIDANDPATH dip; + dip.diph.dwSize = sizeof( DIPROPGUIDANDPATH ); + dip.diph.dwHeaderSize = sizeof( DIPROPHEADER ); + dip.diph.dwObj = 0; + dip.diph.dwHow = DIPH_DEVICE; - // CoInit if needed - hr = CoInitialize( nullptr ); - bCleanupCOM = SUCCEEDED( hr ); - - // Create WMI - hr = CoCreateInstance( __uuidof( WbemLocator ), - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof( IWbemLocator ), - ( LPVOID* )&pIWbemLocator ); - if( FAILED( hr ) || pIWbemLocator == nullptr ) - goto LCleanup; - - // Create BSTRs for WMI - bstrNamespace = SysAllocString( L"\\\\.\\root\\cimv2" ); if( bstrNamespace == nullptr ) goto LCleanup; - bstrDeviceID = SysAllocString( L"DeviceID" ); if( bstrDeviceID == nullptr ) goto LCleanup; - bstrClassName = SysAllocString( L"Win32_PNPEntity" ); if( bstrClassName == nullptr ) goto LCleanup; - - // Connect to WMI - hr = pIWbemLocator->ConnectServer( bstrNamespace, nullptr, nullptr, 0L, - 0L, nullptr, nullptr, &pIWbemServices ); - if( FAILED( hr ) || pIWbemServices == nullptr ) - goto LCleanup; - - // Switch security level to IMPERSONATE - (void)CoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr, - RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, 0 ); - - // Get list of Win32_PNPEntity devices - hr = pIWbemServices->CreateInstanceEnum( bstrClassName, 0, nullptr, &pEnumDevices ); - if( FAILED( hr ) || pEnumDevices == nullptr ) - goto LCleanup; - - // Loop over all devices - for(; ; ) - { - // Get 20 at a time - hr = pEnumDevices->Next( 10000, 20, pDevices, &uReturned ); - if( FAILED( hr ) ) - goto LCleanup; - if( uReturned == 0 ) - break; - - for( iDevice = 0; iDevice < uReturned; iDevice++ ) - { - if ( !pDevices[iDevice] ) - continue; + if ( FAILED( pJoystick->GetProperty( DIPROP_GUIDANDPATH, &dip.diph ) ) ) + return false; - // For each device, get its device ID - hr = pDevices[iDevice]->Get( bstrDeviceID, 0L, &var, nullptr, nullptr ); - if( SUCCEEDED( hr ) && var.vt == VT_BSTR && var.bstrVal != nullptr ) - { - // Check if the device ID contains "IG_". If it does, then it's an XInput device - // Unfortunately this information can not be found by just using DirectInput - if( wcsstr( var.bstrVal, L"IG_" ) ) - { - // If it does, then get the VID/PID from var.bstrVal - DWORD dwPid = 0, dwVid = 0; - WCHAR* strVid = wcsstr( var.bstrVal, L"VID_" ); - if( strVid && swscanf( strVid, L"VID_%4X", &dwVid ) != 1 ) - dwVid = 0; - WCHAR* strPid = wcsstr( var.bstrVal, L"PID_" ); - if( strPid && swscanf( strPid, L"PID_%4X", &dwPid ) != 1 ) - dwPid = 0; - - DWORD dwVidPid = MAKELONG( dwVid, dwPid ); - - // Add the VID/PID to a linked list - XINPUT_DEVICE_NODE* pNewNode = new XINPUT_DEVICE_NODE; - if( pNewNode ) - { - pNewNode->dwVidPid = dwVidPid; - pNewNode->pNext = g_pXInputDeviceList; - g_pXInputDeviceList = pNewNode; - } - } - } - SAFE_RELEASE( pDevices[iDevice] ); - } - } + _wcsupr( dip.wszPath ); -LCleanup: - if( bstrNamespace ) - SysFreeString( bstrNamespace ); - if( bstrDeviceID ) - SysFreeString( bstrDeviceID ); - if( bstrClassName ) - SysFreeString( bstrClassName ); - for( iDevice = 0; iDevice < 20; iDevice++ ) - SAFE_RELEASE( pDevices[iDevice] ); - SAFE_RELEASE( pEnumDevices ); - SAFE_RELEASE( pIWbemLocator ); - SAFE_RELEASE( pIWbemServices ); - - return hr; + return wcsstr( dip.wszPath, L"IG_" ); } - -//----------------------------------------------------------------------------- -// Returns true if the DirectInput device is also an XInput device. -// Call SetupForIsXInputDevice() before, and CleanupForIsXInputDevice() after -//----------------------------------------------------------------------------- -bool IsXInputDevice( const GUID* pGuidProductFromDirectInput ) +VOID FillJoystickInfo( HWND hDlg ) { - // Check each xinput device to see if this device's vid/pid matches - XINPUT_DEVICE_NODE* pNode = g_pXInputDeviceList; - while( pNode ) - { - if( pNode->dwVidPid == pGuidProductFromDirectInput->Data1 ) - return true; - pNode = pNode->pNext; - } - - return false; + TCHAR strJoysInfo[512] = { 0 }; + + DIDEVICEINSTANCE pdidInstance; + pdidInstance.dwSize = sizeof(pdidInstance); + + if ( FAILED ( g_pJoystick->GetDeviceInfo( &pdidInstance ) ) ) + return; + + DIPROPDWORD dipdw; + dipdw.diph.dwSize = sizeof(DIPROPDWORD); + dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER); + dipdw.diph.dwObj = 0; + dipdw.diph.dwHow = DIPH_DEVICE; + + if ( FAILED( g_pJoystick->GetProperty( DIPROP_VIDPID, &dipdw.diph ) ) ) + return; + + WORD wVendorID = LOWORD( dipdw.dwData ); + WORD wProductID = HIWORD( dipdw.dwData ); + + DIPROPGUIDANDPATH dip; + dip.diph.dwSize = sizeof(DIPROPGUIDANDPATH); + dip.diph.dwHeaderSize = sizeof(DIPROPHEADER); + dip.diph.dwObj = 0; + dip.diph.dwHow = DIPH_DEVICE; + + if (FAILED( g_pJoystick->GetProperty( DIPROP_GUIDANDPATH, &dip.diph ) ) ) + return; + + WCHAR* wszPath = dip.wszPath; + + TCHAR strGuidProduct[64] = { 0 }; + TCHAR strGuidInstance[64] = { 0 }; + TCHAR strGuidClass[64] = { 0 }; + + StringFromGUID2(pdidInstance.guidProduct, strGuidProduct, 64); + StringFromGUID2(pdidInstance.guidInstance, strGuidInstance, 64); + StringFromGUID2(dip.guidClass, strGuidClass, 64); + + _stprintf_s(strJoysInfo, 512, + L"Product Name: %s\n" + L"Instance Name: %s\n" + L"Vendor ID: 0x%04x\n" + L"Product ID: 0x%04x\n" + L"Product GUID: %s\n" + L"Instance GUID: %s\n" + L"HID Class GUID: %s\n" + L"HID Usage Page: 0x%04x\n" + L"HID Usage ID: 0x%04x\n" + L"HID Path: %s", + pdidInstance.tszProductName, + pdidInstance.tszInstanceName, + wVendorID, + wProductID, + strGuidProduct, + strGuidInstance, + strGuidClass, + pdidInstance.wUsagePage, + pdidInstance.wUsage, + dip.wszPath); + + EnableWindow(GetDlgItem(hDlg, IDC_INFO), TRUE); + SetWindowText(GetDlgItem(hDlg, IDC_INFO), strJoysInfo); } - -//----------------------------------------------------------------------------- -// Cleanup needed for IsXInputDevice() -//----------------------------------------------------------------------------- -void CleanupForIsXInputDevice() -{ - // Cleanup linked list - XINPUT_DEVICE_NODE* pNode = g_pXInputDeviceList; - while( pNode ) - { - XINPUT_DEVICE_NODE* pDelete = pNode; - pNode = pNode->pNext; - SAFE_DELETE( pDelete ); - } -} - - - //----------------------------------------------------------------------------- // Name: EnumJoysticksCallback() // Desc: Called once for each enumerated joystick. If we find one, create a @@ -430,9 +344,6 @@ BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, auto pEnumContext = reinterpret_cast( pContext ); HRESULT hr; - if( g_bFilterOutXinputDevices && IsXInputDevice( &pdidInstance->guidProduct ) ) - return DIENUM_CONTINUE; - // Skip anything other than the perferred joystick device as defined by the control panel. // Instead you could store all the enumerated joysticks and let the user pick. if( pEnumContext->bPreferredJoyCfgValid && @@ -447,6 +358,12 @@ BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, if( FAILED( hr ) ) return DIENUM_CONTINUE; + if (g_bFilterOutXinputDevices && IsXInputDevice( g_pJoystick )) + { + SAFE_RELEASE( g_pJoystick ); + return DIENUM_CONTINUE; + } + // Stop enumeration. Note: we're just taking the first joystick we get. You // could store all the enumerated joysticks and let the user pick. return DIENUM_STOP; diff --git a/DirectInput/Joystick/joystick.rc b/DirectInput/Joystick/joystick.rc index f9819861..0bafa4f8 100644 --- a/DirectInput/Joystick/joystick.rc +++ b/DirectInput/Joystick/joystick.rc @@ -27,45 +27,45 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // Dialog // -IDD_JOYST_IMM DIALOG DISCARDABLE 0, 0, 190, 182 +IDD_JOYST_IMM DIALOG DISCARDABLE 0, 0, 425, 179 STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "DirectInput Joystick Sample " FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "E&xit",IDCANCEL,156,161,27,14 - LTEXT "between updates is lost.",IDC_STATIC,7,25,153,8 - LTEXT "This sample polls the joystick 30 times a second.", - IDC_STATIC,7,7,153,8 - LTEXT "When using immediate mode, joystick data",IDC_STATIC,7, - 17,153,8 - LTEXT "X Axis:",IDC_X_AXIS_TEXT,18,56,22,8,WS_DISABLED - LTEXT "Y Axis:",IDC_Y_AXIS_TEXT,18,67,22,8,WS_DISABLED - LTEXT "Z Axis:",IDC_Z_AXIS_TEXT,18,78,22,8,WS_DISABLED - LTEXT "Buttons:",IDC_STATIC,18,137,27,8 - LTEXT "X Rotation:",IDC_X_ROT_TEXT,18,93,36,8,WS_DISABLED - LTEXT "POV 0:",IDC_POV0_TEXT,100,82,24,8,WS_DISABLED - GROUPBOX "Joystick State",IDC_STATIC,7,41,176,112 - LTEXT "0",IDC_X_AXIS,63,56,21,8,WS_DISABLED - LTEXT "0",IDC_Y_AXIS,63,67,21,8,WS_DISABLED - LTEXT "0",IDC_Z_AXIS,63,78,21,8,WS_DISABLED - LTEXT "",IDC_BUTTONS,54,137,120,8 - LTEXT "0",IDC_X_ROT,63,93,21,8,WS_DISABLED - LTEXT "0",IDC_POV0,135,82,21,8,WS_DISABLED - LTEXT "Y Rotation:",IDC_Y_ROT_TEXT,18,104,36,8,WS_DISABLED - LTEXT "0",IDC_Y_ROT,63,104,21,8,WS_DISABLED - LTEXT "Z Rotation:",IDC_Z_ROT_TEXT,18,115,36,8,WS_DISABLED - LTEXT "0",IDC_Z_ROT,63,115,21,8,WS_DISABLED - LTEXT "Slider 0:",IDC_SLIDER0_TEXT,100,56,26,8,WS_DISABLED - LTEXT "0",IDC_SLIDER0,135,56,21,8,WS_DISABLED - LTEXT "Slider 1:",IDC_SLIDER1_TEXT,100,67,26,8,WS_DISABLED - LTEXT "0",IDC_SLIDER1,135,67,21,8,WS_DISABLED - LTEXT "POV 1:",IDC_POV1_TEXT,100,93,24,8,WS_DISABLED - LTEXT "0",IDC_POV1,135,93,21,8,WS_DISABLED - LTEXT "POV 2:",IDC_POV2_TEXT,100,104,24,8,WS_DISABLED - LTEXT "0",IDC_POV2,135,104,21,8,WS_DISABLED - LTEXT "POV 3:",IDC_POV3_TEXT,100,115,24,8,WS_DISABLED - LTEXT "0",IDC_POV3,135,115,21,8,WS_DISABLED + DEFPUSHBUTTON "E&xit", IDCANCEL, 391, 159, 27, 14, 0 + LTEXT "between updates is lost.", IDC_STATIC, 7, 25, 153, 8 + LTEXT "This sample polls the joystick 30 times a second.", IDC_STATIC, 7, 7, 153, 8 + LTEXT "When using immediate mode,joystick data", IDC_STATIC, 7, 17, 153, 8 + LTEXT "X Axis:", IDC_X_AXIS_TEXT, 16, 57, 22, 8, WS_DISABLED + LTEXT "Y Axis:", IDC_Y_AXIS_TEXT, 16, 68, 22, 8, WS_DISABLED + LTEXT "Z Axis:", IDC_Z_AXIS_TEXT, 16, 79, 22, 8, WS_DISABLED + LTEXT "Buttons:", IDC_STATIC, 16, 138, 27, 8 + LTEXT "X Rotation:", IDC_X_ROT_TEXT, 16, 94, 36, 8, WS_DISABLED + LTEXT "POV 0:", IDC_POV0_TEXT, 98, 83, 24, 8, WS_DISABLED + GROUPBOX "Joystick State", IDC_STATIC, 5, 42, 176, 112, 0 + LTEXT "0", IDC_X_AXIS, 61, 57, 32, 8, WS_DISABLED + LTEXT "0", IDC_Y_AXIS, 61, 68, 32, 8, WS_DISABLED + LTEXT "0", IDC_Z_AXIS, 61, 79, 32, 8, WS_DISABLED + LTEXT "", IDC_BUTTONS, 52, 138, 120, 8 + LTEXT "0", IDC_X_ROT, 61, 94, 32, 8, WS_DISABLED + LTEXT "0", IDC_POV0, 133, 83, 32, 8, WS_DISABLED + LTEXT "Y Rotation:", IDC_Y_ROT_TEXT, 16, 105, 36, 8, WS_DISABLED + LTEXT "0", IDC_Y_ROT, 61, 105, 32, 8, WS_DISABLED + LTEXT "Z Rotation:", IDC_Z_ROT_TEXT, 16, 116, 36, 8, WS_DISABLED + LTEXT "0", IDC_Z_ROT, 61, 116, 32, 8, WS_DISABLED + LTEXT "Slider 0:", IDC_SLIDER0_TEXT, 98, 57, 26, 8, WS_DISABLED + LTEXT "0", IDC_SLIDER0, 133, 57, 32, 8, WS_DISABLED + LTEXT "Slider 1:", IDC_SLIDER1_TEXT, 98, 68, 26, 8, WS_DISABLED + LTEXT "0", IDC_SLIDER1, 133, 68, 32, 8, WS_DISABLED + LTEXT "POV 1:", IDC_POV1_TEXT, 98, 94, 24, 8, WS_DISABLED + LTEXT "0", IDC_POV1, 133, 94, 32, 8, WS_DISABLED + LTEXT "POV 2:", IDC_POV2_TEXT, 98, 105, 24, 8, WS_DISABLED + LTEXT "0", IDC_POV2, 133, 105, 32, 8, WS_DISABLED + LTEXT "POV 3:", IDC_POV3_TEXT, 98, 116, 24, 8, WS_DISABLED + LTEXT "0", IDC_POV3, 133, 116, 32, 8, WS_DISABLED + GROUPBOX "Joystick Info", IDC_STATIC, 189, 43, 228, 111, 0 + LTEXT "Not connected", IDC_INFO, 198, 53, 215, 99, WS_DISABLED END diff --git a/DirectInput/Joystick/resource.h b/DirectInput/Joystick/resource.h index 5fa901ab..a511d622 100644 --- a/DirectInput/Joystick/resource.h +++ b/DirectInput/Joystick/resource.h @@ -32,6 +32,7 @@ #define IDC_POV1 1042 #define IDC_POV2 1043 #define IDC_POV3 1044 +#define IDC_INFO 1045 // Next default values for new objects // diff --git a/DirectInput/README.md b/DirectInput/README.md new file mode 100644 index 00000000..757fc1de --- /dev/null +++ b/DirectInput/README.md @@ -0,0 +1,82 @@ +# DirectInput Samples + +[https://github.com/walbourn/directx-sdk-samples](https://github.com/walbourn/directx-sdk-samples) + +This is the DirectX SDK's Direct3D 11 sample updated to use Visual Studio 2012 and the Windows SDK 8.0 without any dependencies on legacy DirectX SDK content. This sample is a Win32 desktop DirectX 11.0 application for Windows 10, Windows 8.1, Windows 8, Windows 7, and Windows Vista Service Pack 2 with the DirectX 11.0 runtime. + +**This is based on the legacy DirectX SDK (June 2010) Win32 desktop sample. This is not intended for use with Windows Store apps, Windows RT, or universal Windows apps.** + +The DirectInput API is not available for Windows Store apps or on Windows RT (aka Windows on ARM). The Xbox 360 Common Controller and the XINPUT API is the recommended solution for modern game controllers and is supported on these platforms. + +The DirectInput API is not recommended for use for traditional mouse and keyboard data, and use of standard Win32 messages is preferred. This is why the older DirectX SDK samples "Keyboard" and "Mouse" are not included in the latest DirectX SDK or this package. + +The DirectInput API's remaining utility is for driving HID-only game controllers, haptic devices, and custom force-feedback devices. + +Description +=========== + +CustomFormat +------------ + +![CustomFormat.png](CustomFormat.png) + +This sample illustrates the use of a custom data format. + +**Note:** If your mouse has more than four buttons, not all of the buttons will be used by this sample. + +The comments in CustomFormat.cpp explain how to create, initialize, and retrieve data with a custom data format. You might want to use a custom data format for adding support for a non-standard input device. By enumerating the device objects, you can determine exactly what data is available. The data format you create specifies how the data you are interested in will be stored. + +For compatibility, this sample creates a new format to store mouse data. Usually, you would want to use one of the provided c\_dfDIMouse types, but the steps taken to create the custom format will be the same for any hardware device. For more information, see IDirectInputDevice8::SetDataFormat. + +FFCont +------ + +![ffconst.png](ffconst.png) + +The FFConst sample program applies raw forces to a force-feedback input device, illustrating how a simulator-type application can use force feedback to generate forces computed by a physics engine. + +You must have a force-feedback device connected to your system in order to run the application. + +When you run the application, it displays a window with a crosshair and a black spot in it. Click anywhere within the window's client area to move the black spot. (Note that moving the device itself does not do anything.) FFConst exerts a constant force on the device from the direction of the spot, in proportion to the distance from the crosshair. You can also hold down the mouse button and move the spot continuously. + +This sample program enumerates the input devices and acquires the first force-feedback device that it finds. If none are detected, it displays a message and terminates. + +When the user moves the black spot, joySetForcesXY function converts the cursor coordinates to a force direction and magnitude. This data is used to modify the parameters of the constant force effect. + +Joystick +-------- + +![joystick.png](joystick.png) + +The Joystick sample program obtains and displays joystick data. + +The application polls the joystick for immediate data in response to a timer set inside the dialog procedure. + +Building for Windows XP +======================= + +The DirectInput legacy API is available on Windows XP, so this sample can be built using Visual Studio 2012 with the Windows XP compatible Platform Toolset "v110\_xp" included with _Visual Studio 2012 Update 1_. Remove the link references to `DXGUID.LIB`. You will need to locally define the required GUIDs by using `#define INITGUID` before including `dinput.h` in one of the modules. + +Notes +===== + +* These samples use DirectInput8. The DirectInput7 API is not supported for x64 native applications. The Windows 8.0 SDK only includes the DirectInput8 link library (`dinput8.lib`), and DirectInput7 was last supported by the DirectX SDK (August 2007) release. + +* The Xbox 360 Common Controller driver exposes a legacy HID device for compatability with older DirectInput only applications. Such a device can be used with the Joystick sample as a result. + +* This Xbox One driver for Windows also exposes a legacy HID device that behaves exactly as the Xbox 360 Common Controller driver's HID device support. + +* Legacy joysticks using a "gameport" are not supported for Windows Vista, Windows 7, or Windows 8. Only HID-based USB devices are supported. + +* The "ActionMapper" functionality was removed from DirectInput as of Windows Vista and is no longer supported. + +More Information +================ + +[DirectX Tool Kit: Now with GamePads](http://blogs.msdn.com/b/chuckw/archive/2014/09/05/directx-tool-kit-now-with-gamepads.aspx) + +[Where is the DirectX SDK?](http://blogs.msdn.com/b/chuckw/archive/2012/03/22/where-is-the-directx-sdk.aspx) + +[Where is the DirectX SDK (2013 Edition)?](http://blogs.msdn.com/b/chuckw/archive/2013/07/01/where-is-the-directx-sdk-2013-edition.aspx) + +[Games for Windows and DirectX SDK blog](http://blogs.msdn.com/b/chuckw/) \ No newline at end of file diff --git a/DirectInput/Readme.docx b/DirectInput/Readme.docx deleted file mode 100644 index 55a21f3da36ff1d11a46e7a57c34df8643e5834f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38136 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 XqJ1A7<5wMW)L%P_-eZaRRr>z`?!M2V diff --git a/DirectInput/ffconst.png b/DirectInput/ffconst.png new file mode 100644 index 0000000000000000000000000000000000000000..87c2ecedb42573d6d1aeae1b11aa3b03abc28131 GIT binary patch literal 3127 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 Ah5!Hn literal 0 HcmV?d00001