问题标签 [setupapi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
939 浏览

c# - 使用 Setup Api 枚举监视器 pnp 设备 ID

对于我的程序,我需要获取有关当前显示的详细信息。在我的研究中,我遇到了这篇关于链接 System.Windows.Forms.Screen 类及其 EDID 信息的文章。起初我尝试复制和粘贴使用 p/invoke 找到的代码以提供所有必需的本机方法和结构,但它不起作用,只给了我一个字符串?对于 InstanceID。因此,我尝试使用 MSDN 资源并再次 p/invoke 自己创建代码。这就是我想出的:

我的代码编译并运行,但它没有给我我正在寻找的输出。

我正在寻找的输出是:

但这是我收到的输出:

我的问题是导致 InstanceID 无法正确输出的问题是什么。

0 投票
1 回答
157 浏览

c# - 将 SetupGetInfInformation 从 C++ 编组到 C#

我正在尝试将SetupGetInfInformation函数从 Windows 的 SetupAPI 编组到 C#。

我已经定义了必要的(编组)结构,如下所示:

然后我尝试使用该函数,首先通过为 ReturnBufferSize 参数传递 0 来请求所需的大小缓冲区:

对于这个特定的 INF,这可以成功并且始终返回422,所以我相信这一切都可以正常工作。

但是,下一步(适当地分配缓冲区并第二次调用函数以用请求的数据填充缓冲区)是我遇到困难的地方。

目前,我正在尝试这个(按照上述):

这始终使 vshost.exe 崩溃,并显示“vshost32.exe 已停止工作”对话框,该对话框允许我调试或关闭程序,并且没有其他有用的信息。

我还尝试更改编组的 SetupGetInfInformation 函数签名以反映 SP_INF_INFORMATION (而不是 IntPtr,请参见上面注释掉的行),这样做仍然可以在第一次始终如一地调用 SetupGetInfInformation 并接收422。然后我尝试在缓冲区中为其分配足够的空间,并在第二次调用中传递它,如下所示:

这也会以与上述相同的方式使 vshost.exe 崩溃。

在我看来,我没有为第二次调用分配适当的缓冲区,但我可能也缺少其他必需的项目。

有人介意指出我正确的方向吗?我还没有在 StackOverflow 上找到有关此特定功能的任何帮助,并且搜索正确编组可变大小的数组并使用 Marshal 分配/转移内存很有帮助(和教育),但还没有让我过去问题。

编辑:

感谢 Dave Cluderay 和 Simon Mourier。我已经接受了西蒙的解决方案作为答案,但想提供我完成的代码来(完全)展示如何编组 SetupGetInfInformation 并释放非托管内存:

0 投票
0 回答
317 浏览

c# - 在 C# (WinForms) 中实现 SetupAPI 以读取物理屏幕尺寸

我正在尝试读取我的两台显示器的物理尺寸,以用于学习目的......

我这样做是因为我需要确切地知道鼠标沿屏幕移动的距离(以厘米为单位)。

我尝试了 DPI 的选项,但 scren 总是返回 96 DPI(如果比例为 100%,我已阅读以下内容

但这不是真的,因为:

我的第一台显示器有:

93 DPI

通过除以 600 px / 6,417323 英寸,我们得到 = 93,4 ... dpi

大约,93,4 DPI。

我的第二台显示器:

84,6 DPI

我想,84,6 DPI,比普通显示器少 12 个单位。

所以,我们不能接受这个,因为这是非常不准确的。我想准确地说。


我尝试获取真正的厘米(阅读此内容)并使用PInvoke 进行互操作调用

但正如@Andreas Rejbrand 所说,这会返回一个很大的值(1600 x 900 毫米,1,6 米 x 90 厘米的屏幕,这不合逻辑,我最大的屏幕有 52 厘米 x 29 厘米,除以 1600/900 几乎返回与 52 x 30 相同,即 1,7777,但这对我有用吗???)

PD:询问用户不是一种选择,因为他们可以骗我,我不是这样的事情。


另一个选择是在 WinAPI 中搜索解决方案,我发现了以下内容:(我想我会因为这个 xD 而被否决,但我想解释我所做的一切)

在我分享的最后一个答案中,我发现了以下内容:

https://stackoverflow.com/a/3858175/3286975

这是由某人编辑的,我单击修订,用户共享以下内容:

如何获得显示器的正确物理尺寸?

在评论中,我们可以看到以下链接:

https://ofekshilon.com/2014/06/19/reading-specific-monitor-dimensions/

好吧,我们可以找到以下代码:

我一直在 PInvoke this和 examples 中搜索,但我很迷茫,因为我不知道我们是否可以将其全部翻译成 C#,或者只是一个无法翻译的 C++ 示例。我想它可以翻译,但我不知道如何翻译,我是互操作性调用的新手。

PD:我发现了这个: http: //www.programering.com/a/MDO2YjMwATc.html但我还不知道我必须使用哪些方法将代码翻译成 C# 以及我必须传递的参数。

所以,如果有人能教我如何解决这个问题,如果你想给我一些代码,那很好,但我认为好的解释就足够了。我不知道。

如果有更好的选择,请告诉我。

因为,我的最终解决方案是将此(屏幕厘米)应用于此:https ://stackoverflow.com/a/422333/3286975

另外,我看到 DPI 与 PPI 不同,我可能正在寻找 PPI。

提前致谢!

0 投票
1 回答
2606 浏览

windows - 使用 Windows SetupAPI 获取 USB 设备描述符

我想知道是否可以使用 SetupAPI 函数(如SetupDiGetDeviceRegistryProperty)获取 USB 设备描述符?谢谢!

编辑

到目前为止,我只能收到 Windows友好名称:

0 投票
0 回答
131 浏览

c++ - 如何确定正确的 inf 文件以安装打印机驱动程序

我正在编写一个 C++ 代码来自动安装打印机驱动程序。我使用以下函数来实现从 inf 文件安装。

麻烦在于获取infPath 的值。给定一个驱动程序包,我似乎在其中包含大约 3 个或更多的 inf 文件。我想确定可以用来安装它的正确 inf 文件。有关如何根据系统架构和操作系统版本区分 inf 文件的任何帮助?

另外,我如何从中确定驱动程序的名称?

任何帮助深表感谢。TIA。

0 投票
1 回答
1331 浏览

c++ - 如何知道设备是否已被用户明确禁用?

使用设备管理器,用户可以显式启用/禁用设备,如下图所示。

在此处输入图像描述

对于给定的设备,我想知道它当前是否处于用户禁用/启用状态。

我尝试了以下方法

  1. CM_Get_DevNode_Status(&status, &problem, data.DevInst, 0);我希望存在DN_STARTED,或者DN_DRIVER_LOADED会告诉我。但是,即使操作系统正在加载/卸载驱动程序,当设备连接/断开连接时,这些也可能为零。例如,启用并加载驱动程序的设备。DN_STARTED将是1,但是当我们断开设备连接时,它会在设备条目从设备管理器中删除之前设置为零。
  2. SetupDiGetDeviceRegistryProperty(..., SPDRP_INSTALL_STATE, ...)我虽然状态CM_INSTALL_STATE_INSTALLED应该意味着设备已启用。但即使对于禁用的设备,该函数也会返回此状态。
  3. 使用 WMI 我能够获得所需的信息,但我在 PowerShell 中使用了 wmi。我不想使用 wmi,因为它很难在原生 c++ 中实现。我使用了以下查询。

    Select Name, Availability, ConfigManagerErrorCode, ConfigManagerUserConfig from Win32_PnPEntity where Name = 'NVIDIA Quadro M1000M'

上面查询中的 ConfigManagerErrorCode,如果设置为 22,表示设备已被禁用,21 表示 windows 正在移除设备

我正在寻找一个非 wmi 解决方案。

0 投票
1 回答
1203 浏览

c++ - 未解析的外部符号 _DEVPKEY_Device_BusReportedDeviceDesc

对于连接到我的机器的设备,我想检索 device-property Bus Reported Device Description。为此,我使用Setup APISetupDiGetDeviceProperty函数。在devpkey.h我找到了定义DEVPKEY_Device_BusReportedDeviceDesc

但是,如果我使用DEVPKEY_Device_BusReportedDeviceDesc,我会在链接时收到未解析的外部符号 _DEVPKEY_Device_BusReportedDeviceDesc

这是我的代码(仅包含重现问题的最少代码):

这是完整的错误代码:

错误 LNK2001:未解析的外部符号 _DEVPKEY_Device_BusReportedDeviceDesc

我该如何解决这个问题?

0 投票
2 回答
1634 浏览

c++ - 如何在 Windows 中查找所有已连接的可移动 USB 存储设备?

我正在编写一个处理 USB 驱动器的程序,为了获取有关连接新设备的信息,我注册了一个窗口消息 WM_DEVICECHANGE。但是,我当然不会收到有关在我的程序启动之前连接的设备的消息。为了处理这样的设备,我写了一个搜索功能,但我得到了一个奇怪的结果。它找到了我的闪存驱动器,但不认为它是可移动的。为什么?功能

并输出

错误 21 是读卡器空。闪迪是我的闪存。在调试中我看到 SetupDiGetDeviceRegistryProperty 返回属性 CM_REMOVAL_POLICY_EXPECT_NO_REMOVAL,但我真的不知道为什么......

0 投票
1 回答
259 浏览

c++ - 将 DriverVersion 转换为人类可读的格式

我已经搜索了它的高低,找不到任何文档,我能够按照此处所述获得DriverVersion。创建和枚举设备驱动器正在工作,因此无需查看那里。DriverVersion是一种" DWORDLONG"。我需要将其转换为人类可读的格式,如 20.xx.xx.xx。MSDN 上或我搜索过的任何地方都没有任何文档。

任何帮助将不胜感激。

“ DriverVersion ”的示例值:1688863374327808

代码片段,如果需要的话,

0 投票
0 回答
505 浏览

c++ - DiInstallDevice、InstallSelectedDriver 中的错误 - ERROR_NO_CATALOG_FOR_OEM_INF

好的,所以每当我调用 DiInstallDevice、InstallSelectedDriver 时,我都会收到这个奇怪的错误,指出“ ERROR_NO_CATALOG_FOR_OEM_INF ”。返回的错误代码是 3758096943。当我在 err.exe 中查找时,它说

我正在使用 setupapi,因此除了与“ SetupCopyOEMInf() ”相关的错误之外,该错误没有显示任何错误,而我与之无关。有问题的驱动程序是 Intel HD 520 签名驱动程序。我已经验证并通过 Microsoft 更新目录下载了它。

使用 SetupDiSetSelectedDriver()选择驱动程序,并使用SetupDiSetSelectedDevice()选择正确的设备。如果有人能指出我正确的方向,那就太好了!

代码 :

我想这段代码就足够了,如果没有,请告诉我。整个代码只有几百行,所以。

SetDRVINFO ()函数只是在结构中设置正确的设备和驱动程序,我在调试时验证了它们。两种 else 情况都会引发相同的错误。