level 1
bloodlusty
楼主
function ChangeDeviceState(hDevInfo:HDEVINFO;NewStatus:DWORD;
SelectedItem:DWORD):Boolean;
var
PropChangeParams:SP_PROPCHANGE_PARAMS;
DeviceInfoData:SP_DEVINFO_DATA;
begin
Result:=False;
DeviceInfoData.cbSize:=SizeOf(SP_DEVINFO_DATA);
if not SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,@DeviceInfoData)then Exit;
//Set the PropChangeParams structure.
PropChangeParams.ClassInstallHeader.cbSize:=SizeOf(SP_CLASSINSTALL_HEADER);
PropChangeParams.ClassInstallHeader.InstallFunction:=DIF_PROPERTYCHANGE;
PropChangeParams.Scope:=DICS_FLAG_GLOBAL;
PropChangeParams.StateChange:=NewStatus;
if not SetupDiSetClassInstallParams(hDevInfo,@DeviceInfoData,PSP_CLASSINSTALL_HEADER(@PropChangeParams),SizeOf(PropChangeParams))then
begin
//
Exit;
end;
//Call the ClassInstaller and perform the change.
if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,
@DeviceInfoData)then //---调用SetupDiCallClassInstaller函数执行设备的安装(即:启用或者停用)
begin
Exit;
end;
Result:=True;
end;
function ControlDisk(nStatus,nIndex:Integer):Boolean;
var
Guid:TGUID;
GUIDString:string;
hDevInfo:Cardinal;
i:DWORD;
DeviceInfoData:SP_DEVINFO_DATA;
begin
Result:=False;
if(nStatus=-1)then Exit;
ZeroMemory(@Guid,sizeof(TGUID));
case nIndex of
0://0代表软驱
GUIDString:='{4D36E980-E325-11CE-BFC1-08002BE10318}';
1://1代表光驱
GUIDString:='{4D36E965-E325-11CE-BFC1-08002BE10318}';
2://2代表USB
GUIDString:='{36FC9E60-C465-11CF-8056-444553540000}';
end;
Guid:=StringToGUID(GUIDString);
hDevInfo:=SetupDiGetClassDevs(@Guid,nil,HWND(nil),DIGCF_PRESENT);
if(hDevInfo=INVALID_HANDLE_VALUE) then Exit;
ZeroMemory(@DeviceInfoData,SizeOf(SP_DEVINFO_DATA));
DeviceInfoData.cbSize:=SizeOf(SP_DEVINFO_DATA);
i:=0;
while SetupDiEnumDeviceInfo(hDevInfo,i,@DeviceInfoData) do
begin
if nStatus =1 then
Result:=ChangeDeviceState(hDevInfo,DICS_ENABLE,i)
else if nStatus=2 then
Result:=ChangeDeviceState(hDevInfo,DICS_DISABLE,i);
Inc(i);
end;
SetupDiDestroyDeviceInfoList(hDevInfo);
end;
{调用如下:禁用光驱:ifControlDisk(DICS_DISABLE,1)thenShowMessage('成功禁用!');}
{启用光驱:ifControlDisk(DICS_ENABLE,1)thenShowMessage('启用成功!');}
{注意USB要调用2次ControlDisk(DICS_ENABLE,2)才能完成启用.}
procedure TForm1.Button1Click(Sender: TObject);
begin
if ControlDisk(0,2) then ShowMessage('成功禁用!')
else
ShowMessage('禁用false!');
end;
2017年09月19日 03点09分
1
SelectedItem:DWORD):Boolean;
var
PropChangeParams:SP_PROPCHANGE_PARAMS;
DeviceInfoData:SP_DEVINFO_DATA;
begin
Result:=False;
DeviceInfoData.cbSize:=SizeOf(SP_DEVINFO_DATA);
if not SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,@DeviceInfoData)then Exit;
//Set the PropChangeParams structure.
PropChangeParams.ClassInstallHeader.cbSize:=SizeOf(SP_CLASSINSTALL_HEADER);
PropChangeParams.ClassInstallHeader.InstallFunction:=DIF_PROPERTYCHANGE;
PropChangeParams.Scope:=DICS_FLAG_GLOBAL;
PropChangeParams.StateChange:=NewStatus;
if not SetupDiSetClassInstallParams(hDevInfo,@DeviceInfoData,PSP_CLASSINSTALL_HEADER(@PropChangeParams),SizeOf(PropChangeParams))then
begin
//
Exit;
end;
//Call the ClassInstaller and perform the change.
if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,
@DeviceInfoData)then //---调用SetupDiCallClassInstaller函数执行设备的安装(即:启用或者停用)
begin
Exit;
end;
Result:=True;
end;
function ControlDisk(nStatus,nIndex:Integer):Boolean;
var
Guid:TGUID;
GUIDString:string;
hDevInfo:Cardinal;
i:DWORD;
DeviceInfoData:SP_DEVINFO_DATA;
begin
Result:=False;
if(nStatus=-1)then Exit;
ZeroMemory(@Guid,sizeof(TGUID));
case nIndex of
0://0代表软驱
GUIDString:='{4D36E980-E325-11CE-BFC1-08002BE10318}';
1://1代表光驱
GUIDString:='{4D36E965-E325-11CE-BFC1-08002BE10318}';
2://2代表USB
GUIDString:='{36FC9E60-C465-11CF-8056-444553540000}';
end;
Guid:=StringToGUID(GUIDString);
hDevInfo:=SetupDiGetClassDevs(@Guid,nil,HWND(nil),DIGCF_PRESENT);
if(hDevInfo=INVALID_HANDLE_VALUE) then Exit;
ZeroMemory(@DeviceInfoData,SizeOf(SP_DEVINFO_DATA));
DeviceInfoData.cbSize:=SizeOf(SP_DEVINFO_DATA);
i:=0;
while SetupDiEnumDeviceInfo(hDevInfo,i,@DeviceInfoData) do
begin
if nStatus =1 then
Result:=ChangeDeviceState(hDevInfo,DICS_ENABLE,i)
else if nStatus=2 then
Result:=ChangeDeviceState(hDevInfo,DICS_DISABLE,i);
Inc(i);
end;
SetupDiDestroyDeviceInfoList(hDevInfo);
end;
{调用如下:禁用光驱:ifControlDisk(DICS_DISABLE,1)thenShowMessage('成功禁用!');}
{启用光驱:ifControlDisk(DICS_ENABLE,1)thenShowMessage('启用成功!');}
{注意USB要调用2次ControlDisk(DICS_ENABLE,2)才能完成启用.}
procedure TForm1.Button1Click(Sender: TObject);
begin
if ControlDisk(0,2) then ShowMessage('成功禁用!')
else
ShowMessage('禁用false!');
end;