如何禁用蓝牙,用代码,麻烦知道的兄弟提点一下

解决方案 »

  1.   

    注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentConrolSet\Control\Class\{E0CBF06C-CD8B-4647-BB8A-263B43F0F974},跟这个键值有关
      

  2.   

    http://www.qqread.com/delphi/d352249.html
      

  3.   


    unit untMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,SetupAPI, ComCtrls, StdCtrls, ImgList;type
      TForm1 = class(TForm)
        btn1: TButton;
        lv1: TListView;
        il1: TImageList;
        procedure btn1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
        function GetDeviceClassName(aGUID: TGUID): string;
        //function IsDisableable(WY_dwDevID:Integer;WY_hDevInfo:Cardinal): Boolean;  public
        { Public declarations }
      end;var
      Form1: TForm1;
      ClassImageListData: SP_CLASSIMAGELIST_DATA; {设备类型图标结构,全局变量,退出时释放.}
    implementation{$R *.dfm}
    function IsDisableable(WY_dwDevID:Integer;WY_hDevInfo:Cardinal): Boolean;
    //var
    //WY_DevInfoData:SP_DEVINFO_DATA;
    //WY_dwDevStatus,WY_dwProblem:integer;
    begin
    Result := false;
    end;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
    Exit;// Call the ClassInstaller and perform the change.
    if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo,
    @DeviceInfoData) then
    Exit;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;procedure TForm1.btn1Click(Sender: TObject);
    var
    hDevInfo: Cardinal;
    DeviceInfoData: SP_DEVINFO_DATA; {设备信息结构}
    i: Integer;
    DataT, Buffersize: DWORD;
    Buffer: PAnsiChar;
    List: TListItem;
    index: Integer;
    begin
    { 获取设备信息句柄 }
    lv1.Items.BeginUpdate;
    DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);
    hDevInfo := SetupDiGetClassDevs(nil, nil, 0,
    DIGCF_PRESENT or DIGCF_ALLCLASSES);
    if hDevInfo = INVALID_HANDLE_VALUE then Exit;
    { 设备图标数据结构 }
    ClassImageListData.cbSize := SizeOf(SP_CLASSIMAGELIST_DATA);
    { 获取设备图标数据 }
    if SetupDiGetClassImageList(@ClassImageListData) then
    begin
    { 赋句柄给ImageList }
    il1.Handle := ClassImageListData.ImageList;
    { TreeView图标指定到ImageList }
    lv1.SmallImages := il1;
    end;i := 0;
    Buffersize := 256;
    DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);
    GetMem(Buffer, Buffersize);
    { 枚举设备信息 }
    while SetupDiEnumDeviceInfo(hDevInfo, i, @DeviceInfoData) do
    begin{ 获取设备信息包括GUID和名称 }
    SetupDiGetDeviceRegistryProperty(hDevInfo, @DeviceInfoData,
    SPDRP_DEVICEDESC, @DataT, PByte(Buffer), Buffersize, nil);
    Inc(i);
    List := lv1.Items.Add;
    { 获取制定GUID(设备类型)的图标索引 }
    if SetupDiGetClassImageIndex(@ClassImageListData,
    @DeviceInfoData.ClassGuid, @index) then
    { 制定显示图标 }
    List.ImageIndex := index;
    { 通过GUID获取设备类型(Class) }
    List.Caption := GetDeviceClassName(DeviceInfoData.ClassGuid);
    { 转换GUID到字符串 }
    List.SubItems.Add(GUIDToString(DeviceInfoData.ClassGuid));
    { 显示设备名称 }
    List.SubItems.Add(Buffer);
    { 设备状态 }
    if IsDisableable(i ,hDevInfo) then
    List.SubItems.Add('True')
    else
    List.SubItems.Add('False');end;
    if Buffer <> nil then FreeMem(Buffer);
    if (GetLastError() <> NO_ERROR) and
    (GetLastError() <> ERROR_NO_MORE_ITEMS) then
    Exit;
    { 释放 DeviceInfoData, hDevInfo }
    SetupDiDestroyDeviceInfoList(hDevInfo);
    lv1.Items.EndUpdate;
    end;{最后在退出程序时释放 SetupDiDestroyClassImageList(@ClassImageListData); }
    { 获取设备类型 }
    function TForm1.GetDeviceClassName(aGUID: TGUID): string;
    var
    ClassName: PChar;
    ClassNameSize: DWORD;
    begin
    ClassNameSize := 0;
    GetMem(ClassName, ClassNameSize);
    { 利用GUID返回设备类型名 }
    while not SetupDiClassNameFromGuid(@aGUID, ClassName, ClassNameSize,
    @ClassNameSize) do
    begin
    if GetLastError() = ERROR_INSUFFICIENT_BUFFER then
    begin
    if ClassName <> nil then FreeMem(ClassName);
    GetMem(ClassName, ClassNameSize);
    end else
    Break;
    end;
    Result := ClassName;
    if ClassName <> nil then FreeMem(ClassName);
    end; {设备禁用的代码,是从网上改些一个C++代码的,还没来得及加注解,先看着,以后加.}procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    SetupDiDestroyClassImageList(@ClassImageListData);
    end;end.我整理了一下,还差一个函数IsDisableable这是c的代码,我不懂cBOOL IsDisableable(DWORD WY_dwDevID, HDEVINFO WY_hDevInfo)
    {
     SP_DEVINFO_DATA WY_DevInfoData = {sizeof(SP_DEVINFO_DATA)};
     DWORD    WY_dwDevStatus,WY_dwProblem;
     if(!SetupDiEnumDeviceInfo(WY_hDevInfo,WY_dwDevID,&WY_DevInfoData))
     {
      OutputDebugString("SetupDiEnumDeviceInfo FAILED");
      return FALSE;
     }这是c代码的网址:http://blog.csdn.net/goingup/archive/2006/02/01/590683.aspx
    它既然可以禁用光驱,也应该可以禁用蓝牙
    希望对你有帮助
      

  4.   

    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);只要在注册表中找到相应的键值就可以
      

  5.   

    谢谢楼上的大哥,不过我试了,好像还是没有效果,USB确实是可以的,蓝牙好像没效果