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

康耐视CogPMAlignTool模板匹配详解

康耐视CogPMAlignTool是一款基于边缘特征的模板匹配工具,适用于工业视觉检测。该工具提供PatMax、PatQuick、PatFlex等不同算法,分别对应高精度、快速匹配和柔性表面等应用场景。关键参数包括特征粒度(粗糙/精细)、边缘阈值、弹性范围等,支持旋转缩放匹配和极性忽略功能。工具操作流程包括图像采集、参数设置、模板训练和运行检测,通过调整查找概数、接收阈值等参数可优化识别效果。配套的卡尺工具(CogCaliperTool)通过一维投影和边缘筛选实现精准定位,适用于高精度尺寸测量场景。

2502_92473474的博客 1318

Excel转LaTeX表格神器:excel2latex.xla插件使用全攻略(含下载链接与配置教程)

本文详细介绍了Excel转LaTeX表格神器excel2latex.xla插件的完整使用攻略。从下载安装、基础转换到高级配置,深入讲解了如何利用该插件高效生成LaTeX代码,特别针对IEEE双栏等复杂排版需求提供了专业解决方案,帮助用户彻底告别手动编码,提升学术与专业文档的排版效率。

app77的博客 295

如何禁用笔记本触摸板

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

bruce135lee的专栏 4105

【OpenSearch】从零到一:手把手搭建OpenSearch与Dashboard可视化平台

本文提供了一份详细的OpenSearch与Dashboard可视化平台从零搭建指南。内容涵盖环境准备、系统调优、核心服务安装配置、Dashboard部署与汉化,以及生产环境安全加固建议,帮助用户快速构建一个功能完整的搜索与分析平台。

devops8pract的博客 617

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

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

ObsidianRaven13的博客 444

Python爬虫实战:爬取ETF基金持仓变化

在python复制编辑本文详细介绍了如何使用Python的Scrapy框架爬取ETF基金的持仓变化信息,包括项目的搭建、数据的提取与存储、以及数据的可视化分析。通过本项目,读者可以掌握基本的网页爬虫技术,并应用于实际的财经数据采集与分析中。

2201_76125261的博客 629

基于深度学习的图像识别技术在农业领域中的应用

是识别"病害种类"还是"病害严重度分级"?前者是分类,后者常需分割或分级回归。是叶片级(离体叶片图像)、植株级(田间单株)、地块级(无人机俯拍)?视角不同,模型差异巨大。实时无人机巡检可能要求 < 50 ms/帧(Jetson Orin),而离线测报可接受秒级推理。类别标签、结构化 JSON、GIS 图斑、报警事件?

AI天才研究院 2171

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

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

weixin_34268843的博客 372

3D深度饼图的QT实现

首先,我们需要创建一个QT项目并创建一个窗口,用于显示我们的饼图。在QT Creator中,选择创建一个新的QT Widgets应用程序项目,并创建一个新的窗口类。在本文中,我将介绍如何使用QT实现一个3D深度饼图(Pie 3D)的可视化效果。在构造函数中,我们将创建一个饼图(QChartView)并设置饼图的数据。这是一个简单的示例,您可以根据需要自定义和扩展代码来创建更复杂的饼图。现在,我们已经完成了3D深度饼图的QT实现。您将看到一个具有相应数据的3D深度饼图显示在窗口中。3D深度饼图的QT实现。

CodeJolt的博客 277

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

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

Amon的专栏 8097

SpringBoot整合JWT实战:从零构建无状态认证系统,详解Token生成、验证与安全最佳实践

JWT在SpringBoot中的实现与应用 摘要:本文介绍了JWT(JSON Web Token)的基本概念、与Session机制的对比,以及SpringBoot项目中JWT的整合实现。JWT由Header、Payload和Signature三部分组成,具有无状态、跨域支持等优势。文章详细展示了如何在SpringBoot项目中配置JWT环境,封装JWT工具类来实现Token的生成、解析和验证功能,包括密钥管理、自定义声明、签名验证等核心操作。通过对比表格和生活化比喻,帮助读者理解JWT与传统Session的

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1775

手把手教你学simulink(26.8)--控制算法场景示例:基于强化学习的无人机姿态稳定控制系统

首先,我们需要定义无人机的姿态稳定控制环境。环境包括无人机的状态(姿态角、角速度等)和动作(电机转速)。我们还需要定义奖励函数,用于评估控制器的表现。matlab深色版本% 定义环境% 定义状态空间% 12个状态变量% 定义动作空间% 电机转速范围奖励函数用于评估控制器的表现。我们可以根据无人机的姿态误差、角速度误差以及控制输入的变化率来设计奖励函数。具体来说,当无人机的姿态接近设定值时,给予正奖励;当姿态误差较大或控制输入变化剧烈时,给予负奖励。matlab深色版本。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值