2013-12-18 78 views
1

我想從我的應用程序禁用攝像頭。它改變了設備的狀態在設備管理器從禁止到允許,但設備仍處於活動狀態,當我嘗試關閉設備屬性窗口。它要求重啓系統通過代碼,我可以做到這一點沒有重新啓動系統,以實現他們的changes.Is任何方式。Windows設備禁用

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, 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++) 
{ 
     wchar_t szPhysical[MAX_PATH] = {0}; 
     const char *sstt ="\\Device\\00000079"; 

     while (!SetupDiGetDeviceRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,0L,(PBYTE)szPhysical,2048,0)){} 

     if(szPhysical[0]==sstt[0]) 
     if(szPhysical[1]==sstt[1]) 
     if(szPhysical[2]==sstt[2]) 
     if(szPhysical[3]==sstt[3]) 
     if(szPhysical[4]==sstt[4]) 
     if(szPhysical[5]==sstt[5]) 
     if(szPhysical[6]==sstt[6]) 
     if(szPhysical[7]==sstt[7]) 
     if(szPhysical[8]==sstt[8]) 
     if(szPhysical[9]==sstt[9]) 
     if(szPhysical[10]==sstt[10]) 
     if(szPhysical[11]==sstt[11]) 
     if(szPhysical[12]==sstt[12]) 
     if(szPhysical[13]==sstt[13]) 
     if(szPhysical[14]==sstt[14]) 
     if(szPhysical[15]==sstt[15]){ 

     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(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData)) 
     { 
      printf("Error while calling OP ! Return code is %x\n", GetLastError()); 
      continue; 
     } 
     printf("done.\n\n"); 

    } 

} 

if (GetLastError()!=NO_ERROR &&GetLastError()!=ERROR_NO_MORE_ITEMS) 
{ 
    // Insert error handling here. 
    return 1; 
} 

// Cleanup 
SetupDiDestroyDeviceInfoList(hDevInfo); 

return 0; 

}

任何幫助讚賞

感謝

回答

2

我得到了它的解決方案 進程打開的句柄的硬件和具有DLL,S等加載,這就是爲什麼它需要重新啓動。過程中有鏈接的設備必須退出,以避免在禁用設備之前重新啓動

0

我沒有代表發表評論,否則我將不得不爲這肯定不是一個完整的答案。你看過WMI界面嗎?比如,也許Win32_SystemDriver類會做你want-一下,有一個「禁用」的方法。

+0

謝謝你的回覆,你可以給我任何這個實現的例子或鏈接 – bhupinder

+0

和我無法直接檢測相機實現這個你有任何想法檢測 – bhupinder

+0

這個WMI類的參考文檔是在這裏:http://msdn.microsoft.com/en-us/library/aa394472(v=vs.85).aspx,但你可能會不得不做一些更多的閱讀理解一般來說如何使用WMI(這是一種野獸)。無論如何,聽起來像你解決了你的問題,但我不想讓你的問題懸而未決。 – Aaron