首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用WinAPI/C#获取监视器/显示设备名称

要使用WinAPI/C#获取监视器/显示设备名称,您可以使用以下方法:

  1. 使用EnumDisplayDevices函数枚举所有显示设备。
  2. 使用GetMonitorInfo函数获取显示设备的详细信息。

以下是一个示例代码:

代码语言:csharp
复制
using System;
using System.Runtime.InteropServices;

public class DisplayDevice
{
    public string DeviceName { get; set; }
    public string DeviceString { get; set; }
    public bool IsPrimary { get; set; }

    public DisplayDevice(string deviceName, string deviceString, bool isPrimary)
    {
        DeviceName = deviceName;
        DeviceString = deviceString;
        IsPrimary = isPrimary;
    }
}

public class MonitorInfo
{
    public const int CCHDEVICENAME = 32;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct MONITORINFOEX
    {
        public int cbSize;
        public RECT rcMonitor;
        public RECT rcWork;
        public int dwFlags;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
        public string szDevice;
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFOEX lpmi);

    public static DisplayDevice[] GetDisplayDevices()
    {
        var devices = new System.Collections.Generic.List<DisplayDevice>();
        uint deviceIndex = 0;
        DISPLAY_DEVICE displayDevice = new DISPLAY_DEVICE();
        displayDevice.cb = Marshal.SizeOf(displayDevice);

        while (EnumDisplayDevices(null, deviceIndex, ref displayDevice, 0))
        {
            devices.Add(new DisplayDevice(displayDevice.DeviceName, displayDevice.DeviceString, displayDevice.StateFlags.HasFlag(DisplayDeviceStateFlags.PrimaryDevice)));
            deviceIndex++;
            displayDevice.cb = Marshal.SizeOf(displayDevice);
        }

        return devices.ToArray();
    }

    public static string GetMonitorName(IntPtr hMonitor)
    {
        var monitorInfo = new MONITORINFOEX();
        monitorInfo.cbSize = Marshal.SizeOf(monitorInfo);
        GetMonitorInfo(hMonitor, ref monitorInfo);
        return monitorInfo.szDevice;
    }
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DISPLAY_DEVICE
{
    public int cb;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
    public string DeviceName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string DeviceString;
    public DisplayDeviceStateFlags StateFlags;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string DeviceID;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string DeviceKey;
}

[Flags()]
public enum DisplayDeviceStateFlags : int
{
    None = 0x0,
    AttachedToDesktop = 0x1,
    MultiDriver = 0x2,
    PrimaryDevice = 0x4,
    MirroringDriver = 0x8,
    VGACompatible = 0x10,
    Removable = 0x20,
    Disconnect = 0x2000000,
    Remote = 0x4000000,
    ModeChanged = 0x8000000
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

使用示例:

代码语言:csharp
复制
var displayDevices = MonitorInfo.GetDisplayDevices();
foreach (var displayDevice in displayDevices)
{
    Console.WriteLine($"Device Name: {displayDevice.DeviceName}");
    Console.WriteLine($"Device String: {displayDevice.DeviceString}");
    Console.WriteLine($"Is Primary: {displayDevice.IsPrimary}");
}

这将输出所有显示设备的名称、字符串和是否为主显示设备。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

EasyCVR通过大华SDK接入设备,通道名称过长显示不全如何解决?

在用户现场接入时,前端设备通过大华SDK接入EasyCVR平台,接入成功后,发现通道名称未能显示全,如图所示:进入设备后台,正确显示名称如下:针对该情况,我们对代码进行了分析和排查。...单独使用c++调试,获取到的名称也为显示不全的名称。因为我们使用的大华sdk函数为CLIENT_QueryChannelName,查看文档后得知:第二个参数pChannelName是获取通道名称。...在分配字符串长度大于32字节时,获取到的通道名称还是32个字节,所以当通道名称过长时,会导致通道名称显示不全。所以,函数CLIENT_QueryChannelName在此处不可用。...继续查找大华sdk文档,查看是否有获取通道名称的相关信息。我们发现,文档中有个CLIENT_GetNewDevConfig函数,也可以获取通道名称。...修改上述模块中的c++代码,参考如下:最终前端展示效果如下,此时通道名称已经可以完全显示了:EasyCVR平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力。

45540

如何使用AndroidQF快速从Android设备获取安全取证信息

关于AndroidQF AndroidQF,全称为Android快速取证(Android Quick Forensics)工具,这是一款便携式工具,可以帮助广大研究人员快速从目标Android设备获取相关的信息安全取证数据...AndroidQF旨在给广大研究人员提供一个简单且可移植的跨平台实用程序,以快速从Android设备获取信息安全取证数据。...工具下载 广大研究人员可以直接访问该项目的【Releases页面】下载获取最新版本的AndroidQF。...工具使用 在启动AndroidQF之前, 我们需要将目标Android设备通过USB线连接到我们的主机上,别忘了开启USB调试功能。 启动USB调试之后,我们就可以继续启动AndroidQF了。...获取到加密的取证文件之后,我们可以使用下列方式进行解密: $ age --decrypt -i ~/path/to/privatekey.txt -o .zip .zip.age

7K30

提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票

在这个数字化时代,利用爬虫技术获取特价机票信息已成为一种常见的策略。通过结合C#和Fizzler库,我们可以更加高效地实现这一目标,尤其是在抢购高峰期。...通过C#编写的程序可以定时运行,保持数据的最新状态,帮助用户第一时间获取到特价机票信息。 个性化推送服务: 通过爬虫技术获取的特价机票信息,我们可以根据用户的偏好和需求进行个性化的推送服务。...实现 以下是一个简单的C#代码示例,展示了如何实现上述功能: using System; using System.Net; using System.Net.Http; using System.Threading.Tasks...在ScrapeWebsite方法中,配置HttpClient使用代理IP,发送HTTP请求获取页面内容,并解析为HTML文档。 使用Fizzler选择器提取特价机票信息,遍历并输出目的地和价格。...希望这篇文章和代码示例能够帮助您提升编码技能,更高效地获取特价机票信息。祝您编程愉快!

9210

libzplay库

Library is using native WINAPI functions from kernel32.dll, user32.dll, gdi32.dll and winmm.dll....Just pure WINAPI. Library will play music directly to soundcard. Simple and easy....; 这个示例讲解了打开音频设备,播放,但是关于第一个参数的音频名称,可以通过directshow,或者directsound等方法枚举音频设置; 所以这个示例,可以替代portaudio,或者directsound...\r\n”, player->GetError()); player->Release(); return ; } player->Play(); 示例3: 获取MP3解码值,或音频设备采集值...; 这个是关心的,但是,在示例代码中没有看到示例程序,也没有看到说明文档; 不过可以根据:MsgWaveBuffer猜测,应该是支持数据获取的;所以这里的示例首先参考回调函数设置的示例,然后设置数据获取

95920

Electron中调用DLL

fr=aladdin Edge.js 开源项目 edge 可以帮助我们实现 Node 和 .NET 之间的相互调用 我们最常见就是使用它来调用C#的代码方法或者C#生成的DLL文件的方法 C/C++生成的...为什么需要使用DLL 需要使用系统 API 操作或扩展应用程序; 需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过 C++ 动态链接库(DLL)实现的; 需要调用...User32.dll中的函数 C#代码 /// /// 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。...,在随后的GDI函数中可以使用该句柄在设备上下文环境中绘图。...extern int ToAscii(int uVirtKey,int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey,int fuState); 根据进程名称获取窗口句柄

11.5K41

c#——IntPtr

c#中无法将类型“int”隐式转换为“System.IntPtr” 这个是我引用了一个api函数时出现的问题,我在声明中把intptr换成了int还是不可以,这是为什么呢?要如何处理呢?...答: 您好,C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。...例如,在一个C#程序中调用Win32API mciSendString函数控制光盘驱动器,这个函数的函数原型是: MCIERROR mciSendString( LPCTSTR lpszCommand...IntPtr.Zero将句柄设置为0; 或者使用类型强制转换: mciSendString("set cdaudio door open", null, 0, (IntPtr)0 ); 或者,使用IntPtr...构造函数: IntPtr a = new IntPtr(2121); 这里有两点比较重要: 一是在C#中声明Win32API时,一定要按照WinAPI的原型来声明,不要改变它的数据类型; 二是尽量不要过多使用类型强制转换或构造函数的方式初始化一个

93431

C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)

列表的Github地址如下: https://github.com/xamarin/XamarinComponents 今天我们主要是以设备信息组件为例子介绍一下如何使用社区组件 首先我们需要查询到自己需要使用的组件...因为是英文,而且单词比较简单,所以我直接用谷歌翻译了,表格如下: 名称 描述 的NuGet 文档和来源 创造者 录音机 在设备的麦克风输入上录制音频。...= CrossDeviceInfo.Current.Platform.ToString(); date.Add(new { TextName = model, Name = "设备名称...; } }  因为封装的已经很完善了,直接通过静态类CrossDeviceInfo,就可以获取相关的设备信息. tip:最新的版本新增了判断是否为模拟器的功能...元素有两个属性path和name,使用path来标识要更改的元素,并使用name来标识元素上的属性名称

4K71

windows服务管理操作

显示名称以及一个SERVICE_STATUS 结构体,该结构体的原型如下: typedef struct _SERVICE_STATUS{ DWORD dwServiceType; //服务类型...} } 获取服务的主程序所在路径、启动类型以及依赖项 上述代码只能获取到系统服务的部分信息,比如服务的名称显示名称,等等至于其他的信息需要调用另外的API函数获取 OpenService...下面的代码展示了如何调用这两个函数 //第一个参数是通过OpenSCManager函数获取得到的 SC_HANDLE h_SCService = OpenService(h_SCHandle, pSrvItem...获取系统服务主要使用的API函数是QueryServiceConfig2 BOOL WINAPI QueryServiceConfig2( __in SC_HANDLE hService..., __in LPCTSTR lpServiceName,//服务名称 __in LPCTSTR lpDisplayName,//显示名称 __in

1.7K10

SNMP学习笔记之iReasoning MIB Browser

0x01 如何获取CISCO设备OID值 思科的交换机snmp oid信息查询  http://tools.cisco.com/Support/SNMP/do/BrowseOID.do 1、通过交换机执行命令...“show version”获取IOS名称,如下图标红的内容 ?...4、选择自己需要的MIB库,如CISCO环境监视器MIB文件,名称是CISCO-ENVMON-MIB,点击V2 我需要查看设备的温度值,找到具体的OBJECT-TYPE,如下图的 ciscoEnvMonTemperatureStatusTable...6、根据查询的OID,通过snmpwalk命令进行获取 ? 7、cpu信息获取 下表显示他们替换的新的MIB和他们的对象在旧有MIB旁边和对象: ?...CSICO-3560内存池空闲,内存池总大小=使用+空闲 0x02 华为MIB库 如何下载华为设备MIB  http://support.huawei.com/huaweiconnect/enterprise

6.7K30

Ceph:关于 Ceph 存储架构的一些笔记

ceph osd df:显示 OSD 的使用情况,包括总容量、已用空间、可用空间等信息。 ceph osd pool ls:列出所有的 OSD 数据存储池,包括数据存储池名称、ID 等信息。...文件系统的客户端首先向 MDS 发出请求,这会提供必要的信息以便从正确的 OSD 获取文件内容 查看 Ceph 集群的 MDS(Metadata Server)服务信息 ceph mds dump:显示所有的...要查看 Ceph 中 RBD 的服务信息,可以使用以下命令: rbd ls:显示所有的 RBD 块设备,包括块设备名称、大小等信息。...rbd snap ls :列出指定 RBD 块设备的所有快照,包括快照名称、创建时间等信息。 rbd du:显示 RBD 块设备使用情况,包括总使用容量、总可用容量等信息。...crush_rule 0:这是使用的 CRUSH 规则的编号,CRUSH 是 Ceph 集群用于计算数据位置的分布式算法,该规则规定了如何将数据分散到存储设备上。

93210

60 个 Linux 网络命令和脚本收集 不断更新

arpwatch – 以太网活动监视器。 bmon – 带宽监视器和速率估计器。 bwm-ng – 实时网络带宽监视器。 curl – 使用 URL 传输数据。...(或尝试 httpie) darkstat – 捕获网络流量、使用情况统计信息。 dhclient – 动态主机配置协议客户端 dig – 查询 DNS 服务器以获取信息。...ibmonitor – 显示带宽和传输的总数据。 ifstat – 报告网络接口带宽。 iftop  – 显示带宽使用情况。...IPTraf  – IP 网络监视器。 iputils – 一组用于 Linux 网络的小实用程序。 iw – 一种新的基于 nl80211 的无线设备 CLI 配置实用程序。...nslookup – 交互式查询 Internet 名称服务器。 ping – 向网络主机发送 icmp echo_request。 route – 显示/操作 IP 路由表。

85220

用深度学习硬件的闲置时间,来挖比特币

但当你没有优化任何东西时,如何让所有的teraflops都被充分利用? 最近比特币价格一路飙升,您可以考虑利用这些闲置的资源来获取利润。...所以,在设置完所有东西并启动显示器后,你需要做的就是照常使用你的GPU box,矿工和深度学习之间的overlap只需几秒钟。...要获取访问GPU设备(假定为/ dev/ nvidia *)的进程列表,请使用fuser命令行工具。...这里只有一个选项,它指定GPU设备检查使用的频率。默认情况下,每10秒执行一次检查,并收集有关系统中所有GPU的数据。 GPU配置可以由一个或多个名称中带有gpu-prefix的部分来指定。...发生这种情况是由于fuser命令的安全限制,它不会显示其他用户进程打开设备文件。如果你遇到这种情况,但是仍然想要使用gpu_mon,你有两种选择: *以root身份运行gpu_mon。

1.3K60

10min教你编写C#上位机控制Arduino板载LED

本文以一个编写串口上位机控制Arduino板载LED的小任务,来完整的展示如何从下位机做到上位机,包含了Arduino、串口、C#编程程,麻雀虽小,可是五脏俱全哦~ 1.任务需求 编写一个电脑上位机控制...: 关于编程语言:我会C#,Qt,Matlab,都可以编写,但是此处不需要跨平台,没有大量数据分析,所以选择使用C#,可以最快完成; 关于通信方式:电脑和Arduino之间可以使用串口、USB、网络通信...3.实现思路 确定了任务需求后,在做嵌入式产品的时候讲究的是慢,稳,一步一步的来实现: ① 编写Arduino程序让LED以1s的间隔闪烁; ② 加入串口发送数据功能,使用Arduino自带串口监视器测试...; ③ 加入串口接收功能,使用Arduino自带串口监视器测试; ④ 硬件程序搞定,编写上位机利用串口发送数据; 4.硬件程序 LED闪烁程序 int led = 13; void setup()....Items.AddRange(baud); //设置选项默认值 comboBox2.Text = "115200"; //获取电脑当前可用串口并添加到选项列表中

3.4K40

DLL注入与安全

要调用dll,最起码也需要知道dll的位置和名称吧。因此,我们需要把dll的路径和名字写入到内存中。...可以获取调用DLL函数的的API的函数地址 FARPROC WINAPI GetProcAddress( _In_ HMODULE hModule, _In_ LPCSTR lpProcName...umm,那么我们应该如何做呢?   思考一:能不能不让他人使用对我们的应用程序执行成功这个函数?...思考1:被修改前如何做?   不让出现危险的环境,这个或许很难做到,除非客户端电脑受到全面的监控,软件使用者需要共同维护安全环境。   思考2:被修改后如何做?   ...结束语 作为使用者,我们要保证我们的环境是安全的。作为软件开发者,要假想如果不处于安全环境下,该如何保证软件的使用安全。让我们共同携手维护互联网安全。

52420
领券