2012-06-24 7 views
5

घर वापस आकर हम एक भाप वीडियो गेम से संबंधित एक समस्या पर गए: मुझे नियमित रूप से लेट गया, और वेब पर खोज करके मुझे पता चला कि यह कुछ नियंत्रण उपकरणों से आया है, मेरा वेब कीबोर्डविंडोज वातावरण में डिवाइस को अक्षम करने का प्रयास

समाधान मानक प्रबंधक-क्लिक => अक्षम ऑपरेशन के साथ डिवाइस मैनेजर (मानव इंटरफ़ेस डिवाइस अनुभाग) में कुछ छिपाई डिवाइस को निष्क्रिय करना है। इसलिए मैंने गेम लॉन्च करते समय इन उपकरणों को अक्षम करने के लिए एक छोटी उपयोगिता को कोड करना शुरू कर दिया, और बाहर निकलने के बाद उन्हें पुनः सक्षम कर दिया।

सेटअपुप एपीआई फ़ंक्शंस का उपयोग करके, मैं उन डिवाइसों को अलग करने में कामयाब रहा जिन्हें मैं अक्षम करना चाहता था, लेकिन जब मैं उन्हें DICS_DISABLE ऑपरेशन लागू करके अक्षम करता हूं, जैसे कि मैंने उन्हें सही माउस बटन विधि से अक्षम कर दिया है, तो डिवाइस " डिवाइस प्रबंधक में अनजान डिवाइस "। मुझे डिवाइस मैनेजर में उन्हें वापस लाने के लिए डिवाइस के ड्राइवर अपडेट करना होगा। मैंने DICS_STOP ऑपरेशन की भी कोशिश की, लेकिन इसके साथ ही डिवाइस डीएम से गायब हो गए ...

क्या इस ऑपरेशन में मुझे कुछ याद आ रही है?

मेरा प्रोटोटाइप कोड यहां है: (कंसोल एप्लिकेशन, x64) => सिस्टम x64 है, और यदि मेरा एप्लिकेशन 32 बिट्स है, तो सभी डिवाइस ऑपरेशन बस असफल हो जाते हैं।

#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

किया यू इस कोड को क्रियान्वित करने क्योंकि मैं मेरे लिए डीएम में उपकरणों परिवर्तन की यह एक ही कोड का दर्जा implemeting रहा हूं, लेकिन यह मेरे प्रणाली – bhupinder

उत्तर

8

आप पैरामीटर गलत है, तो आप एक भरा SP_PROPCHANGE_PARAMSDeviceInfoData में साथ

SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData) 

की जरूरत है।

उदाहरण के लिए this देखें। (यह चीनी में है, बस कोड पढ़ें पर्याप्त है)

+0

कि समस्या हल हो जाती आपकी मदद के लिए धन्यवाद :) पुन: प्रारंभ करने की आवश्यकता होती है के बाद रिस्टार्ट करना पड़ेगा । मैं पैराम्स में उसी कोड ans DICS_ENABLE के साथ डिवाइस को वापस सक्षम करने में भी कामयाब रहा। स्टेट चेंज फ़ील्ड। – axiagame

+0

को इस कोड को निष्पादित करने के बाद पुनरारंभ करना आवश्यक था क्योंकि मैं मेरे लिए डीएम में डिवाइस परिवर्तनों की एक ही कोड स्थिति को लागू कर रहा हूं लेकिन मुझे सिस्टम – bhupinder

+0

नहीं पुनरारंभ करने की आवश्यकता है, नहीं। लेकिन मुझे लगता है कि यह आपके ओएस पर निर्भर हो सकता है। व्यक्तिगत रूप से मैंने इसे केवल विंडोज 7 पर चलाया। – axiagame

0

devcon का उपयोग किया है! this का प्रयास करें: DevCon को निष्क्रिय

संबंधित मुद्दे