2012-06-24 17 views
5

Eve döndüğümüzde, bir buhar video oyunuyla ilgili bir sorun yaşadık: Düzenli gecikmelerim var ve web'de arama yaparak bunun bazı kontrol cihazlarından geldiğini gördüm. benim klavyem. Bu çözüm, aygıt yöneticisinde (insan arabirimi aygıtları bölümündeki) bazı HID ​​aygıtlarını standart sağ tıklatma => devre dışı bırakma işlemiyle devre dışı bırakmaktır. Bu yüzden, oyunu başlatırken bu cihazları devre dışı bırakmak için küçük bir yardımcı program başlatmaya ve çıktıktan sonra yeniden etkinleştirmeye başladım.Windows ortamında bir aygıtı devre dışı bırakmaya çalışmak

SetupDI API işlevlerini kullanarak, devre dışı bırakmak istediğim aygıtları ayırmayı başardım, ancak DICS_DISABLE işlemini uygulayarak devre dışı bıraktığımda, onları doğru fare düğmesi yöntemiyle devre dışı bırakmış gibi davranmak yerine, aygıtlar " cihazsız aygıtlar. Cihaz yöneticisinde onları geri almak için cihazların sürücülerini güncellemeliyim. Ayrıca, DICS_STOP işlemini denedim, ancak bu cihazla sadece DM ...

Bu işlemde eksik olan bir şey var mı?

İşte benim prototip kodum: (konsol uygulaması x64) => sistem x64, ve uygulamam 32 bit ise, tüm aygıt işlemleri başarısız oluyor.

#include <stdio.h> 
#include <Windows.h> 
#include <setupapi.h> 
#include <devguid.h> 
#include <regstr.h> 

#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; 
} 
+0

ui benim için DM cihazlar değişikliklerin bu aynı kod durumunu implemeting ediyorum ama yardımınız için teşekkür :) konuyu çözmüş sistemi – bhupinder

cevap

8

Sen DeviceInfoData bir dolu SP_PROPCHANGE_PARAMS ile

SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData) 

ihtiyaç parametre yanlış var.

Örneğin, this'a bakın. (Çince, sadece kod yeterlidir)

+0

yeniden beni gerektirdiğinden bu kodu yürüttükten sonra yeniden gerekli yaptım devre dışı . Aynı zamanda cihazı params.StateChange alanında aynı kod ve DICS_ENABLE ile tekrar etkinleştirmeyi başardım. – axiagame

+0

, bu kod yürütüldükten sonra yeniden başlatmayı gerektirdi çünkü benim için DM'deki bu cihazların aynı kod değişiklikleri durumunu uyguluyordum ama sistem – bhupinder

+0

Hayır'ı yeniden başlatmamı gerektirmiyordu. Ama bence işletim sisteminize bağlı olabilir. Şahsen sadece windows 7'de koştum. – axiagame

0

Kullanılan devcon! this deneyin: DevConAranan

İlgili konular