Essayer de désactiver un périphérique dans l’environnement Windows

En rentrant chez nous, nous avons eu un problème concernant un jeu vidéo à vapeur: j’ai eu des décalages réguliers et en cherchant sur le Web, j’ai constaté que cela venait de certains dispositifs de contrôle, comme mon clavier WE.

La solution consiste à désactiver certains périphériques HID dans le gestionnaire de périphériques (section Périphériques d’interface utilisateur) avec le clic droit standard => désactiver. J’ai donc commencé à coder un petit utilitaire pour désactiver ces périphériques lors du lancement du jeu et les réactiver après avoir quitté.

En utilisant les fonctions API SetupDI, j’ai réussi à isoler les périphériques que je voulais désactiver, mais quand je les désactive en appliquant l’opération DICS_DISABLE, au lieu d’agir comme si je les désactivais avec le bouton droit de la souris, le gestionnaire de périphériques. Je dois mettre à jour les pilotes des périphériques pour les récupérer dans le gestionnaire de périphériques. J’ai aussi essayé l’opération DICS_STOP, mais avec celle-ci les appareils disparaissent tout simplement de la DM …

Y a-t-il quelque chose qui me manque dans cette opération?

Voici mon code prototype: (application console, x64) => le système est x64, et si mon application est de 32 bits, toutes les opérations du périphérique échouent.

#include  #include  #include  #include  #include  #pragma comment (lib, "Newdev.lib") #pragma comment (lib, "Setupapi.lib") int main(int argc, void * argv[]) { HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; DWORD i; SP_PROPCHANGE_PARAMS params; // params to set in order to enable/disable the device // Create a HDEVINFO with all present devices. hDevInfo = SetupDiGetClassDevs(NULL, 0, // Enumerator 0, DIGCF_PRESENT | DIGCF_ALLCLASSES ); if (hDevInfo == INVALID_HANDLE_VALUE) { // Insert error handling here. return 1; } // Enumerate through all devices in Set. DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i, &DeviceInfoData);i++) { DWORD DataT; LPTSTR buffer = NULL; LPTSTR servBuffer = NULL; DWORD buffersize = 0; DWORD servBufferSize = 0; // // Call function with null to begin with, // then use the returned buffer size (doubled) // to Alloc the buffer. Keep calling until // success or an unknown failure. // // Double the returned buffersize to correct // for underlying legacy CM functions that // return an incorrect buffersize value on // DBCS/MBCS systems. // while (!SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, &DataT, (PBYTE)buffer, buffersize, &buffersize)) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { // Change the buffer size. if (buffer) LocalFree(buffer); // Double the size to avoid problems on // W2k MBCS systems per KB 888609. buffer = (LPTSTR)LocalAlloc(LPTR,buffersize * 2); } else { // Insert error handling here. break; } } while (!SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_SERVICE, &DataT, (PBYTE)servBuffer, servBufferSize, &servBufferSize)) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { // Change the buffer size. if (servBuffer) LocalFree(servBuffer); // Double the size to avoid problems on // W2k MBCS systems per KB 888609. servBuffer = (LPTSTR)LocalAlloc(LPTR,servBufferSize * 2); } else { // Insert error handling here. break; } } if (strstr((char *)buffer, "(HID)") && NULL == servBuffer) { printf("New device found : %s\n", buffer); printf("disabling...\n"); // init the structure params.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; params.HwProfile = 0; params.Scope = DICS_FLAG_CONFIGSPECIFIC; params.StateChange = DICS_DISABLE; // prepare operation if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, &params.ClassInstallHeader, sizeof(params))) { printf("Error while preparing params !\n"); break; } // launch op if (!SetupDiCallClassInstaller(DICS_DISABLE, hDevInfo, &DeviceInfoData)) { printf("Error while calling OP ! Return code is %x\n", GetLastError()); continue; } printf("done.\n\n"); } if (buffer) LocalFree(buffer); } if ( GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS ) { // Insert error handling here. return 1; } // Cleanup SetupDiDestroyDeviceInfoList(hDevInfo); return 0; } 

Vous avez le paramètre incorrect, vous avez besoin

 SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData) 

avec un SP_PROPCHANGE_PARAMS rempli dans DeviceInfoData .

Voir cela par exemple. (c’est en chinois, il suffit de lire le code suffit)

Avoir utilisé devcon! Essayez ceci : devcon disable