C# 禁用启用设备管理器中的设备

【C#】控制设备管理器中设备的启用/禁用_20220506 通过C#代码实现设备管理器的启用/停止 引入Manamger程序集,查找到所需设备,控制启停 阅读详情

需求

Windows系统做嵌入式系统,开放U口,禁止使用键盘

使用到的Win32Api

[Flags]
public enum DIGCF : uint
{
    DEFAULT = 0x00000001,
    PRESENT = 0x00000002,
    ALLCLASSES = 0x00000004,
    PROFILE = 0x00000008,
    DEVICEINTERFACE = 0x00000010
}

[StructLayout(LayoutKind.Sequential)]
public struct SP_DEVINFO_DATA
{
    public UInt32 cbSize;
    public Guid ClassGuid;
    public UInt32 DevInst;
    public IntPtr Reserved;
}

[StructLayout(LayoutKind.Sequential)]
public struct SP_DEVINFO_DATA
{
    public UInt32 cbSize;
    public Guid ClassGuid;
    public UInt32 DevInst;
    public IntPtr Reserved;
}
[StructLayout(LayoutKind.Sequential)]
public struct SP_CLASSINSTALL_HEADER
{
    public UInt32 cbSize;
    public DIF InstallFunction;
}
[StructLayout(LayoutKind.Sequential)]
public struct SP_PROPCHANGE_PARAMS
{
    public SP_CLASSINSTALL_HEADER ClassInstallHeader;
    public DICS StateChange;
    public DICS_FLAG Scope;
    public UInt32 HwProfile;
}
public enum DIF : uint
{
            SELECTDEVICE = 0x00000001,
            INSTALLDEVICE = 0x00000002,
            ASSIGNRESOURCES = 0x00000003,
            PROPERTIES = 0x00000004,
            REMOVE = 0x00000005,
            FIRSTTIMESETUP = 0x00000006,
            FOUNDDEVICE = 0x00000007,
            SELECTCLASSDRIVERS = 0x00000008,
            VALIDATECLASSDRIVERS = 0x00000009,
            INSTALLCLASSDRIVERS = 0x0000000A,
            CALCDISKSPACE = 0x0000000B,
            DESTROYPRIVATEDATA = 0x0000000C,
            VALIDATEDRIVER = 0x0000000D,
            DETECT = 0x0000000F,
            INSTALLWIZARD = 0x00000010,
            DESTROYWIZARDDATA = 0x00000011,
            PROPERTYCHANGE = 0x00000012,
            ENABLECLASS = 0x00000013,
            DETECTVERIFY = 0x00000014,
            INSTALLDEVICEFILES = 0x00000015,
            UNREMOVE = 0x00000016,
            SELECTBESTCOMPATDRV = 0x00000017,
            ALLOW_INSTALL = 0x00000018,
            REGISTERDEVICE = 0x00000019,
            NEWDEVICEWIZARD_PRESELECT = 0x0000001A,
            NEWDEVICEWIZARD_SELECT = 0x0000001B,
            NEWDEVICEWIZARD_PREANALYZE = 0x0000001C,
            NEWDEVICEWIZARD_POSTANALYZE = 0x0000001D,
            NEWDEVICEWIZARD_FINISHINSTALL = 0x0000001E,
            UNUSED1 = 0x0000001F,
            INSTALLINTERFACES = 0x00000020,
            DETECTCANCEL = 0x00000021,
            REGISTER_COINSTALLERS = 0x00000022,
            ADDPROPERTYPAGE_ADVANCED = 0x00000023,
            ADDPROPERTYPAGE_BASIC = 0x00000024,
            RESERVED1 = 0x00000025,
            TROUBLESHOOTER = 0x00000026,
            POWERMESSAGEWAKE = 0x00000027,
            ADDREMOTEPROPERTYPAGE_ADVANCED = 0x00000028,
            UPDATEDRIVER_UI = 0x00000029,
            FINISHINSTALL_ACTION = 0x0000002A,
            RESERVED2 = 0x00000030,
}
public enum DICS : uint
{
    ENABLE = 0x00000001,
    DISABLE = 0x00000002,
    PROPCHANGE = 0x00000003,
    START = 0x00000004,
    STOP = 0x00000005,
}
[Flags]
public enum DICS_FLAG : uint
{
    GLOBAL = 0x00000001,
    CONFIGSPECIFIC = 0x00000002,
    CONFIGGENERAL = 0x00000004,
}

[DllImport("setupapi.dll", SetLastError = true)]
public static extern bool SetupDiDestroyDeviceInfoList(IntPtr handle);
[DllImport("setupapi.dll", SetLastError = true)]
public static extern IntPtr SetupDiGetClassDevsW([In] ref Guid ClassGuid, [MarshalAs(UnmanagedType.LPWStr)]string Enumerator, IntPtr parent, DIGCF flags);
[DllImport("setupapi.dll", SetLastError = true)]
public static extern bool SetupDiEnumDeviceInfo(IntPtr deviceInfoSet, UInt32 memberIndex, [Out] out SP_DEVINFO_DATA deviceInfoData);
[DllImport("setupapi.dll", SetLastError = true)]
public static extern bool SetupDiSetClassInstallParams(IntPtr deviceInfoSet, [In] ref SP_DEVINFO_DATA deviceInfoData,[In] ref SP_PROPCHANGE_PARAMS classInstallParams, UInt32 ClassInstallParamsSize);
[DllImport("setupapi.dll", SetLastError = true)]
public static extern bool SetupDiChangeState(IntPtr deviceInfoSet, [In] ref SP_DEVINFO_DATA deviceInfoData);
[DllImport("setupapi.dll", SetLastError = true)]
pulic static extern bool SetupDiDestroyDeviceInfoList(IntPtr handle);

如何找到设备所属类的GUID

在这里插入图片描述

/// <summary>
/// HID
/// </summary>
private static readonly string HIDDevice = "{745a17a0-74d3-11d0-b6fe-00a0c90f57da}";
/// <summary>
/// Keyboard
/// </summary>
private static readonly string Keyboard = "{4d36e96b-e325-11ce-bfc1-08002be10318}";
/// <summary>
/// Mouse
/// </summary>
private static readonly string Mouse = "{4d36e96f-e325-11ce-bfc1-08002be10318}";
/// <summary>
/// USB
/// </summary>
private static readonly string USB = "{36fc9e60-c465-11cf-8056-444553540000}";

禁用方法

public static void DisableDevice(string deviceClassGuid)
{
    IntPtr info = IntPtr.Zero;
    Guid NullGuid = Guid.Empty;
    try
    {
        info = SetupDiGetClassDevsW(ref NullGuid, null, IntPtr.Zero, DIGCF.ALLCLASSES|DIGCF.PROFILE);
        SP_DEVINFO_DATA devdata = new SP_DEVINFO_DATA();
        devdata.cbSize = (UInt32)Marshal.SizeOf(devdata);
        ///遍历设备
        for (uint i = 0; SetupDiEnumDeviceInfo(info, i, out devdata); i++)
        {
            if (devdata.ClassGuid == new Guid(deviceClassGuid))
            {
                SP_CLASSINSTALL_HEADER header = new SP_CLASSINSTALL_HEADER();
                header.cbSize = (UInt32)Marshal.SizeOf(header);
                header.InstallFunction = DIF.PROPERTYCHANGE;
                SP_PROPCHANGE_PARAMS propchangeparams = new SP_PROPCHANGE_PARAMS
                {
                    ClassInstallHeader = header,
                    StateChange = DICS.DISABLE,
                    Scope = DICS_FLAG.GLOBAL,
                    HwProfile = 0
                };
                SetupDiSetClassInstallParams(info, ref devdata, ref propchangeparams, (UInt32)Marshal.SizeOf(propchangeparams));
                SetupDiChangeState(info, ref devdata);
            }
        }
    }
    catch (Exception ex)
    {
        throw new Exception(string.Format("ChangeMouseState failed,the reason is {0}", ex.Message));
    }
    finally
    {
        if (info != IntPtr.Zero)
            SetupDiDestroyDeviceInfoList(info);
    }
}

启用方法

public static void EnableDevice(string deviceClassGuid)
{
    IntPtr info = IntPtr.Zero;
    Guid NullGuid = Guid.Empty;
    try
    {
        info = SetupDiGetClassDevsW(ref NullGuid, null, IntPtr.Zero, DIGCF.ALLCLASSES);
        SP_DEVINFO_DATA devdata = new SP_DEVINFO_DATA();
        devdata.cbSize = (UInt32)Marshal.SizeOf(devdata);
        ///遍历设备
        for (uint i = 0; SetupDiEnumDeviceInfo(info, i, out devdata); i++)
        {
            if (devdata.ClassGuid == new Guid(deviceClassGuid))
            {
                SP_CLASSINSTALL_HEADER header = new SP_CLASSINSTALL_HEADER();
                header.cbSize = (UInt32)Marshal.SizeOf(header);
                header.InstallFunction = DIF.PROPERTYCHANGE;
                SP_PROPCHANGE_PARAMS propchangeparams = new SP_PROPCHANGE_PARAMS
                {
                    ClassInstallHeader = header,
                    StateChange = DICS.ENABLE,
                    Scope = DICS_FLAG.GLOBAL,
                    HwProfile = 0
                };
                SetupDiSetClassInstallParams(info, ref devdata, ref propchangeparams, (UInt32)Marshal.SizeOf(propchangeparams));
                SetupDiChangeState(info, ref devdata);
            }
        }
    }
    catch (Exception ex)
    {
        throw new Exception(string.Format("ChangeMouseState failed,the reason is {0}", ex.Message));
    }
    finally
    {
        if (info != IntPtr.Zero)
            SetupDiDestroyDeviceInfoList(info);
    }
}
【C#】通过Devcon.exe控制设备管理器中设备的启停 通过Devcon控制设备管理器中的启停 阅读详情

相关推荐

解决相同型号USB设备在Windows系统中重复枚举问题

本文详细解析了Windows系统中相同型号USB设备重复枚举问题的成因及解决方案。通过修改注册表、使用PsTools工具清除设备记录以及编程实现自动化处理等方法,有效解决设备识别混乱问题,特别适用于自动化测试和工业设备管理场景。

weixin_42561040的博客 565

C#通过API对硬件进行禁用和启用

慢慢的随着年龄的增长,脑子越来越不够用,而自己的收藏栏也越来越杂乱,虽然现在的网上要啥都有,但是没有经过自己亲手实验和整理总结,下次需要的时候一切又要从头开始,而电子星球却正好提供了一个整理的平台,同时因为平台福利也算给了动力,所以遇到问题后又自己亲手解决了,就想记录总结下来,以备自己查阅,也希望能帮助需要的人。同时也感谢电子星球提供这样的平台 最近在做项目的过程中,涉及到对硬件启用及禁用的功能(在指定时间段内才能启用硬件)。因为C#自身对硬件的操作基本为零,但是C#操作底层硬件基本都通过API实现,AP

l550802356的博客 1966

Windows USB设备管理与故障修复技术详解

USB设备管理是Windows系统运维中的重要环节,涉及驱动管理、注册表操作等底层技术。通过设备管理器接口与注册表修改,可以实现USB端口的启用/禁用控制与故障修复,这对数据安全防护与设备维护具有实用价值。在企业环境中,这类技术常用于防止数据泄露、解决外设识别异常等场景。典型的实现方案包括WMI设备枚举、SetupAPI驱动管理以及注册表键值修复,其中驱动问题约占USB故障的70%。专业的USB管理工具往往整合了批量控制、智能修复等高级功能,大幅提升运维效率。

weixin_33735077的博客 413

C# 禁用 硬件设备

全部使用 setupapi.dll 里的函数 使用方法   IList _HardwareInfo = Zgke.SysInfo.HardwareClass.GetHardwareTable();            dataGridView1.DataSource = _HardwareInfo;            for (int i = 0; i != _Hardw

Zgke 7358

C#上位机开发实战:使用HIDlibrary高效读写USB设备数据

在C#上位机开发中,与硬件设备通信是常见的需求,尤其是通过USB接口。HID(人机接口设备)协议作为操作系统识别键盘、鼠标、游戏手柄等输入设备的标准,为这类通信提供了基础框架。其原理在于定义了一套统一的数据格式和通信方式,使得主机能够识别并驱动各类HID设备。对于开发者而言,直接调用系统底层API进行设备操作较为繁琐,因此封装库的价值得以体现,它能简化开发流程,提升效率。在需要定制化通信、解析原始数据包或开发专用调试工具的应用场景下,这类技术尤为重要。本文聚焦于C#中一个广泛使用的库——HIDlibrary

conghuang7343的博客 465

C#获取Windows音频设备信息:Core Audio API与WMI结合实践

在Windows音频编程中,获取声音设备信息是构建专业音频应用的基础需求。通过Windows Core Audio API可以准确枚举音频端点设备并获取友好名称,而WMI(Windows Management Instrumentation)则能查询到硬件的唯一标识PNPDeviceID。结合这两种技术,开发者可以实现可靠的设备识别与绑定,解决用户在多设备环境下选择特定音频硬件的痛点。本文以C#为例,详细解析了如何利用NAudio库和System.Management命名空间,实现音频设备的完整信息获取,包

weixin_34162228的博客 402

c语言启用网络网络,c++ 以编程方式禁用/启用网络接口

我试图提出一个解决方案,以编程方式启用/禁用网卡 – 我做了大量的研究,在XP和Vista环境中似乎都不是一个可行的解决方案。我在说的是,如果您进入控制面板的“网络连接”,右键单击并选择启用或禁用。理想情况下,我想使用一个图书馆,但如果更糟糕的是,我可以打电话给一个命令行程序,但绝对是最坏的情况。这是我迄今为止所尝试过的,何处/为什么他们失败:这个上一篇文章:列出了几种方法 – 第一种是使用net...

weixin_42520796的博客 1316

Windows操作系统的硬件设备自动识别和驱动程序安装机制

开发人员可以利用操作系统提供的API和工具来获取设备信息、管理设备和驱动程序,从而更好地支持硬件设备的自动化安装和配置。当用户插入一个新的设备时,操作系统会自动扫描设备的硬件标识符(Hardware ID)和供应商标识符(Vendor ID),以确定设备的类型和制造商信息。上述示例代码使用了System.Management命名空间中的ManagementObjectSearcher类来执行设备查询,并通过获取设备对象的属性值来获取设备的相关信息,包括硬件标识符和驱动程序安装状态。

CyberJolt的博客 1355

(转)如何禁用Windows 10系统的触摸屏

https://baijiahao.baidu.com/s?id=1593890738706748667 现在许多优质的Windows 10个人电脑都配备了触摸屏,因为触摸屏的日益普及,Windows 10作为操作系统的触摸以及触摸屏确实提供了大量的多功能性。 然而,人们可以通过触摸屏获得Windows 10个人电脑的各种原因,有些人不需要触摸屏。 这可能是因为人们想要一台功能强...

weixin_33854644的博客 846

USB端口管理工具:启用与禁用的一键解决方案

回顾USB端口管理的重要性,它是保障计算机系统安全、维护用户数据隐私、以及优化资源使用效率的关键环节。从初始的物理拔插操作到现今的软件控制,USB端口管理的便捷性与安全性得到了显著提高。在企业环境中,USB端口的管理可以防止数据泄露,保证商业信息的安全;在教育机构中,它能防止学生随意使用USB存储设备进行不当操作;而在家庭环境中,家长可以通过管理USB端口来保护孩子不受网络风险的影响。

weixin_30789053的博客 819

C#系统硬件设备管理(监视,启用,禁用)源代码

C#系统硬件设备管理(监视,启用,禁用)源代码!

C# 根据设备实例路径,获取父节点(父系)的设备实例路径

我们知道有时候系统的某些设备异常,可以通过(禁用启用)重启该设备。但是某些设备操作当前设备是没起作用的,例如扬声器设备,禁用后扬声器仍然可以播放声音,但是如果禁用了该设备的父节点则不再可以播放声音。 可以从设备管理器中查看 这里就是父节点 如果通过C#怎么获取该设备的父系实例路径呢?可以使用以下方式 /// <summary>定位到设备节点</summary>...

log103628的博客 667

c#中禁用和开启网卡

c#中禁用和开启网卡 使用API 不是调用控制面板命令

不拔插U盘也可重新启用U盘

在运用 U盘的流程中,如果你“安全删除硬件”后没把大白菜http://winbaicai.zhuangjiba.com/的U盘拔下,忽然又想起要继续运用 U盘,你会如何办?一般情况下都是拔下重插。有没有更基本的要领?有!但是先说个更复杂的:   在“我的电脑”上右击——“属性”——“硬件”——“设备管理器”——在列表中展开“通用串行总线控制器”——在“USB Root Hub”上右击选择“停

u012789898的专栏 2006

深入解析五大ADC芯片架构及其应用场景

本文深入解析了五大ADC芯片架构及其应用场景,包括逐次逼近型ADC、Σ-Δ型ADC、流水线型ADC、闪存型ADC和积分型ADC。通过详细的架构分析和实际应用案例,帮助工程师理解不同ADC芯片的特点和适用场景,提升电路设计效率。

weixin_28702105的博客 355

YOLOv8 ultralytics使用笔记----labelme标记数据,训练模型、追踪目标。

Ultralytics是一个Python库,它是为执行高级计算机视觉任务而创建的,如对象检测、实例分割、图像分类等。Ultralytics为YOLO模型发布了一个全新的存储库,它被构建为用于机器视觉统一框架。这里先利用,并激活。

qq_48050838的博客 1万+

如何禁用笔记本触摸板

很多笔记本的触摸板不好用,想要禁止,然后另外连接键盘鼠标使用,小编自己就是使用的笔记本禁用触摸板驱动,安装完重启电脑后,在电脑右下角任务栏上有个图标,点鼠标右键,选择设置--定点装置属性--禁用,就可以了,想用的时候就开启回来就行了。 需要的朋友们可以来下载试试吧! 如何禁用笔记本触摸板 一、完全禁用 由于在笔记本BIOS中找不到禁用PS/2接口的选项,所以只能卸载系统自带的

bruce135lee的专栏 4105

从赛题到实战:一份面向高职“区块链技术应用”赛项的食品溯源系统全栈部署与运维指南

本文为高职院校学生备战“区块链技术应用”技能大赛提供了一份详实的食品溯源系统全栈部署与运维指南。内容涵盖从理解赛题业务逻辑、绘制技术蓝图,到搭建4节点FISCO BCOS联盟链、部署管理平台与智能合约,再到核心运维技能与前后端联调测试的完整流程,旨在帮助参赛者将赛题转化为可运行的实战项目,全面提升区块链全栈开发与运维能力。

weixin_29172201的博客 680

提升效率:快速解决Windows设备错误代码43的5个技巧

这种方式可以直接列出所有状态异常的设备,尤其是那些返回错误代码43的设备,省去了手动查找的麻烦。在很多情况下,错误代码43是由于最近的驱动更新导致的。比如先快速扫描定位问题设备,然后尝试最简单的重启操作,如果不奏效再考虑驱动回滚,最后才进行驱动更新。我们可以编写脚本或使用工具一次性对所有问题设备执行相同的修复操作,同时实时监控每个设备的修复状态和进度,确保没有遗漏。总之,遇到Windows设备错误代码43不必慌张,掌握这些技巧后,你完全可以在几分钟内解决问题,把更多时间用在真正重要的事情上。

ObsidianRaven13的博客 444

YOLOv11改进 | 引入SFSConv空间频率选择卷积(含SFSC3k2二次创新),空间频率特征协同作用,检测性能全面提升

本文提出在YOLOv11中引入SFSConv空间频率选择卷积模块,通过显式分离和动态融合空间域与频率域特征,解决传统卷积对多尺度目标检测的局限性。SFSConv包含空间频率分离、动态权重融合和协同特征重建三个核心机制,并进一步创新提出SFSC3k2结构,通过双路频率分支增强特征协同作用。该改进显著提升了YOLOv11在遥感、医学等多尺度复杂场景下的检测性能,实验显示在微小目标检测任务中mAP提升5%-10%。代码实现展示了SFSConv模块的核心逻辑及其在PyTorch中的高效实现。

走向CTO的路上... 768

手把手教你用ESP32-S3打造智能聊天机器人-立创实战派

本文将详细介绍如何利用立创ESP32-S3开发板,烧录小智AI程序,快速实现一个功能强大的聊天机器人。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 9917

Canoe硬件连接与License激活全流程:从驱动安装到总线通信验证

CAN总线与CAN FD通信测试是车载网络开发的基础环节,其核心在于硬件驱动、授权管理与工程配置的协同。Vector接口卡需通过专用驱动实现PC识别,License授权则决定软件功能范围,二者共同支撑总线通信验证。在车载以太网与AUTOSAR架构逐步普及的背景下,掌握驱动安装、License激活及通道映射等基础操作,能有效提升诊断开发与网络管理验证效率。本文围绕Canoe环境搭建,详解Vector Driver Setup安装、License Manager激活及工程配置中的常见问题与排查技巧。

weixin_34268843的博客 372

ubuntu:E: 无法定位软件包yum解决方法

如果出现以下问题,则需要更新yum源 yum源位于/etc/apt/sources.list yum源更新的网站有 清华大学开源镜像 中科大开源镜像 1.此处更新yum源的时候先备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo gedit /etc/apt/sources.list 将更新源替换成上面符合版本系列号 我用的版本号为20.04 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释

码农研究僧的博客 1万+

C#调用Microsoft.DirectX.DirectSound:常见问题及解决方案

在使用 C# 开发音频相关应用时,调用 Microsoft.DirectX.DirectSound 可能会遇到一些常见问题。以下是按照出现顺序整理的问题及解决方案,帮助开发者快速解决类似困扰。

Amon的专栏 8097

目标检测YOLO实战应用案例100讲-【目标检测】缺陷检测(二)

在工业生产中总是经常遇到裂痕、划痕等产品的表面缺陷问题,机器视觉行业对于表面检测相比前几年已经有很大的突破,对于产品表面的划伤、污迹等检测已经不再是难点。在金属、玻璃、手机屏幕、液晶板等行业表面检测上应用广泛。但由于该类缺陷形状不规则、深浅对比度低,而且往往会被产品表面的自然纹理或图案所干扰。因此,表面划痕缺陷检测对于正确打光、相机分辨率、被检测部件与工业相机的相对位置、复杂的机器视觉算法等要求非常高。

qq_36130719的博客 728

(四)激光线扫描-光平面标定

激光发射器投射出一条线,形成的一个扇形区域平面就是光平面,也叫光刀面,与物体相交就形成了一道线激光。如果物体形状不是规则的,自然相交的线就会是一条蜿蜒曲折的线条。AxByCzD0AxByCzD0从而可以获得图像线激光上像素点的深度。💡 注意:平面方程是在同一个坐标系下定义的(如相机坐标系),所以一旦激光平面标定完成之后,激光器和相机的相对位置就必须固定不动了。

FlyWine的博客 6139
上一篇: C# 获取windows系统的显示器个数
下一篇: C# 截取屏幕
码哈
博客等级 码龄8年 6粉丝 22原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值