获取显示器(主/副屏)友好名称(FriendlyName)
在开发涉及多显示器的应用程序时,获取显示器的友好名称(Friendly Name)是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法,了解其实现细节和工作原理。
方法签名
public static string GetMonitorFriendlyName(bool isPrimary)
方法概述
GetMonitorFriendlyName 方法用于获取指定显示器的友好名称。参数 isPrimary 指定是否获取主显示器的友好名称。
实现原理
- 先获取显示设备的目标设备信息和源设备信息,再将目标设备信息(友好名称)和源设备信息(逻辑设备名称)关联起来
- 获取要求获取屏幕(主/副屏)的信息(包含逻辑设备名称)
- 通过逻辑设备名称关联,再找到相应屏幕的友好名称
实现细节
1. 获取屏幕信息:
var screen = ScreenHelper.GetScreen(isPrimary);
2. 获取目标设备名称:
var targetDeviceNames = GeTargetDeviceNames();
调用 GeTargetDeviceNames 方法获取所有活动路径的目标设备名称和源设备名称。
3. 匹配屏幕设备名称:
return targetDeviceNames.FirstOrDefault(m => m.Item2.viewGdiDeviceName.EqualsIgnoreCase(screen.DeviceName)).Item1.monitorDevicePath;
核心方法
GeTargetDeviceNames 方法: 该方法获取所有活动路径的目标设备名称和源设备名称,并将目标设备名称和源设备名称相匹配。其实现涉及调用 Windows API 函数 GetDisplayConfigBufferSizes 和 QueryDisplayConfig,并解析返回的显示配置信息。
/// <summary>
/// 获取显示器FriendlyName名称
/// </summary>
/// <returns></returns>public static IEnumerable<(DISPLAYCONFIG_TARGET_DEVICE_NAME, DISPLAYCONFIG_SOURCE_DEVICE_NAME)>GeTargetDeviceNames(){List<(DISPLAYCONFIG_TARGET_DEVICE_NAME, DISPLAYCONFIG_SOURCE_DEVICE_NAME)> listRet = new();try{int error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,out var pathCount, out var modeCount);if (error != ERROR_SUCCESS)throw new Win32Exception(error);DISPLAYCONFIG_PATH_INFO[] DisplayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount];DISPLAYCONFIG_MODE_INFO[] DisplayModes = new DISPLAYCONFIG_MODE_INFO[modeCount];error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,ref pathCount, DisplayPaths, ref modeCount, DisplayModes, IntPtr.Zero);if (error != ERROR_SUCCESS)throw new Win32Exception(error);for (int i = 0; i < modeCount; i++){var modeInfo = DisplayModes[i];if (modeInfo.infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET){var targetName =GetDisplayconfigTargetDeviceName(DisplayModes[i].adapterId, DisplayModes[i].id);var displayPathInfo = DisplayPaths.FirstOrDefault(m =>m.targetInfo.adapterId.LowPart == modeInfo.adapterId.LowPart &&m.targetInfo.adapterId.HighPart == modeInfo.adapterId.HighPart &&m.targetInfo.id == modeInfo.id);var sourceName = GetDisplayconfigSourceDeviceName(displayPathInfo.sourceInfo.adapterId,displayPathInfo.sourceInfo.id);listRet.Add((targetName, sourceName));}}}catch (Exception ex){}return listRet;}
相关辅助方法
- GetDisplayconfigTargetDeviceName 方法:获取目标设备的详细信息,包括友好名称
- GetDisplayconfigSourceDeviceName 方法: 获取源设备的详细信息,包括显示设备逻辑名称。
public const int ERROR_SUCCESS = 0;public enum QUERY_DEVICE_CONFIG_FLAGS : uint
{QDC_ALL_PATHS = 0x00000001,QDC_ONLY_ACTIVE_PATHS = 0x00000002,QDC_DATABASE_CURRENT = 0x00000004
}public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint
{DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF
}public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint
{DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF
}public enum DISPLAYCONFIG_ROTATION : uint
{DISPLAYCONFIG_ROTATION_IDENTITY = 1,DISPLAYCONFIG_ROTATION_ROTATE90 = 2,DISPLAYCONFIG_ROTATION_ROTATE180 = 3,DISPLAYCONFIG_ROTATION_ROTATE270 = 4,DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
}public enum DISPLAYCONFIG_SCALING : uint
{DISPLAYCONFIG_SCALING_IDENTITY = 1,DISPLAYCONFIG_SCALING_CENTERED = 2,DISPLAYCONFIG_SCALING_STRETCHED = 3,DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,DISPLAYCONFIG_SCALING_CUSTOM = 5,DISPLAYCONFIG_SCALING_PREFERRED = 128,DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF
}public enum DISPLAYCONFIG_PIXELFORMAT : uint
{DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff
}public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint
{DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
}public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint
{DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6,DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF
}[StructLayout(LayoutKind.Sequential)]
public struct LUID
{public uint LowPart;public int HighPart;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_SOURCE_INFO
{public LUID adapterId;public uint id;public uint modeInfoIdx;public uint statusFlags;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_TARGET_INFO
{public LUID adapterId;public uint id;public uint modeInfoIdx;DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;DISPLAYCONFIG_ROTATION rotation;DISPLAYCONFIG_SCALING scaling;DISPLAYCONFIG_RATIONAL refreshRate;DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;public bool targetAvailable;public uint statusFlags;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_RATIONAL
{public uint Numerator;public uint Denominator;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_INFO
{public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;public uint flags;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_2DREGION
{public uint cx;public uint cy;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
{public ulong pixelRate;public DISPLAYCONFIG_RATIONAL hSyncFreq;public DISPLAYCONFIG_RATIONAL vSyncFreq;public DISPLAYCONFIG_2DREGION activeSize;public DISPLAYCONFIG_2DREGION totalSize;public uint videoStandard;public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_TARGET_MODE
{public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;
}[StructLayout(LayoutKind.Sequential)]
public struct POINTL
{int x;int y;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_SOURCE_MODE
{public uint width;public uint height;public DISPLAYCONFIG_PIXELFORMAT pixelFormat;public POINTL position;
}[StructLayout(LayoutKind.Explicit)]
public struct DISPLAYCONFIG_MODE_INFO_UNION
{[FieldOffset(0)]public DISPLAYCONFIG_TARGET_MODE targetMode;[FieldOffset(0)]public DISPLAYCONFIG_SOURCE_MODE sourceMode;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_MODE_INFO
{public DISPLAYCONFIG_MODE_INFO_TYPE infoType;public uint id;public LUID adapterId;public DISPLAYCONFIG_MODE_INFO_UNION modeInfo;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS
{public uint value;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_DEVICE_INFO_HEADER
{public DISPLAYCONFIG_DEVICE_INFO_TYPE type;public uint size;public LUID adapterId;public uint id;
}[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME
{public DISPLAYCONFIG_DEVICE_INFO_HEADER header;public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags;public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;public ushort edidManufactureId;public ushort edidProductCodeId;public uint connectorInstance;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string monitorFriendlyDeviceName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]public string monitorDevicePath;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public partial struct DISPLAYCONFIG_SOURCE_DEVICE_NAME
{public DISPLAYCONFIG_DEVICE_INFO_HEADER header;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string viewGdiDeviceName;
}
[DllImport("user32.dll")]
public static extern int GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS Flags,out uint NumPathArrayElements,out uint NumModeInfoArrayElements
);[DllImport("user32.dll")]
public static extern int QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS Flags,ref uint NumPathArrayElements,[Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray,ref uint NumModeInfoArrayElements,[Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray,IntPtr CurrentTopologyId
);[DllImport("user32.dll")]
public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName
);
[DllImport("user32.dll")]
public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_SOURCE_DEVICE_NAME deviceName
);
[DllImport("user32", CharSet = CharSet.Auto)]
public static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi);
/// <summary>
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto,Pack=4)]
public struct MONITORINFO
{/// <summary>/// </summary> public int cbSize;/// <summary>/// </summary> public ScreenHelper.RECT rcMonitor;/// <summary>/// </summary> public ScreenHelper.RECT rcWork;/// <summary>/// </summary> public int dwFlags ;/*[MarshalAs(UnmanagedType.ByValArray, SizeConst=32)] public char[] szDevice;*/[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string DeviceName;
}public static DISPLAYCONFIG_TARGET_DEVICE_NAME GetDisplayconfigTargetDeviceName(LUID adapterId, uint targetId)
{DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME();deviceName.header.size = (uint)Marshal.SizeOf(typeof(DISPLAYCONFIG_TARGET_DEVICE_NAME));deviceName.header.adapterId = adapterId;deviceName.header.id = targetId;deviceName.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;int error = DisplayConfigGetDeviceInfo(ref deviceName);if (error != ERROR_SUCCESS)throw new Win32Exception(error);return deviceName;
}public static DISPLAYCONFIG_SOURCE_DEVICE_NAME GetDisplayconfigSourceDeviceName(LUID adapterId, uint targetId)
{DISPLAYCONFIG_SOURCE_DEVICE_NAME deviceName = new DISPLAYCONFIG_SOURCE_DEVICE_NAME();deviceName.header.size = (uint)Marshal.SizeOf(typeof(DISPLAYCONFIG_SOURCE_DEVICE_NAME));deviceName.header.adapterId = adapterId;deviceName.header.id = targetId;deviceName.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;int error = DisplayConfigGetDeviceInfo(ref deviceName);if (error != ERROR_SUCCESS)throw new Win32Exception(error);return deviceName;
}
示例代码
以下是 GetMonitorFriendlyName 方法的完整实现:
public static string GetMonitorFriendlyName(bool isPrimary)
{try{var screen = ScreenHelper.GetScreen(isPrimary);var targetDeviceNames = GeTargetDeviceNames();return targetDeviceNames.FirstOrDefault(m => m.Item2.viewGdiDeviceName.EqualsIgnoreCase(screen.DeviceName)).Item1.monitorDevicePath;}catch (Exception ex){return string.Empty;}
}
相关文章:
获取显示器(主/副屏)友好名称(FriendlyName)
在开发涉及多显示器的应用程序时,获取显示器的友好名称(Friendly Name)是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法,了解其实现细节和工作原理。 方法签名 public static string GetMonitorFriendlyName(bool i…...
Apache Solr RCE(CVE-2017-12629)--vulhub
Apache Solr 远程命令执行漏洞(CVE-2017-12629) Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…...
2.3 携程的hook实现及dlsym函数
背景知识:(排除static 情况) 一个进程中可以有相同的命名吗? -- 不能 两个进程之间可以有相同的命名吗?--可以 一个进程和另一个静态库可以有相同的命名吗?--不能 一个进程和另一个动态库之间可以有相同…...
机器学习之KNN算法
K-Nearest Neighbors (KNN) 是一种常见的机器学习算法,广泛应用于分类和回归问题。KNN是一种基于实例的学习方法,它利用训练数据集的实例来进行分类或回归预测。在KNN中,预测的结果依赖于距离度量函数计算出的最近邻实例的标签或值。下面我们…...
《全排列问题》
题目描述 按照字典序输出自然数 11 到 nn 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 nn。 输出格式 由 1∼n1∼n 组成的所有不重复的数字序列,每行一个序列。 每个数字保留…...
pycharm 快捷键
PyCharm 是一款功能强大的集成开发环境(IDE),提供了丰富的快捷键来提高开发效率。以下是一些常用的 PyCharm 快捷键(基于 Windows/Linux 系统,Mac 系统可能略有不同): 通用快捷键 功能快捷键&a…...
若依微服务如何获取用户登录信息
文章目录 1、需求提出2、应用场景3、解决思路4、注意事项5、完整代码第一步:后端获取当前用户信息第二步:前端获取当前用户信息 5、运行结果6、总结 1、需求提出 在微服务架构中,获取当前用户的登录信息是开发常见的需求。无论是后端处理业务…...
RunCam WiFiLink连接手机图传测试
RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线(易忘) 2.打开摄像头前面的盖子(易忘) 3.接上直流电源,红线为正,黑线为负 4.直流电源设置电压为14v,电流为3.15A, 通…...
TCP三次握手,四次挥手
三次握手 第一次握手:客户端向服务器发送一个 SYN 包,其中 SYN 标志位被设置为 1,表示客户端请求建立连接,并随机生成一个初始序列号 seqx 。此时客户端进入 SYN_SENT 状态,等待服务器的确认1.第二次握手:服…...
Mono里建立调试C#脚本运行环境
前面已经介绍了怎么样来执行一个嵌入式的脚本框架, 这个框架是mono编写的一个简单的例子。 如果不清楚,可以参考前文: https://blog.csdn.net/caimouse/article/details/144632391?spm=1001.2014.3001.5501 本文主要来介绍一下,我们的C#脚本是长得怎么样的,它大体如下…...
Linux dnf 包管理工具使用教程
简介 dnf 是基于 Red Hat Linux 发行版的下一代包管理工具,它代替 yum 提供更好的性能、更好的依赖处理和更好的模块化架构。 基础语法 dnf [options] [command] [package] 常用命令用法 更新元数据缓存 sudo dnf check-update# 检查已安装的包是否有可用的更…...
Java 创建线程的方式有哪几种
在 Java 中,创建线程的方式有四种,分别是:继承 Thread 类、实现 Runnable 接口、使用 Callable 和 Future、使用线程池。以下是详细的解释和通俗的举例: 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法来创建线程。 步…...
计算机的错误计算(一百八十七)
摘要 用大模型计算 sin(123.456789). 其自变量为弧度。结果保留16位有效数字。第一个大模型是数学大模型。先是只分析,不计算;后经提醒,才给出结果,但是是错误结果。第二个大模型,直接给出了Python代码与结果…...
12. 最大括号深度
题目描述 现有一字符串仅由"(",")", "{","}", "[", "]"六种括号组成。若字符串满足以下条件之一, 则为无效字符串:任一类型的左右括号数量不相等 存在未按正确顺序(先左后右)闭合的括号输出…...
进程与线程以及如何查看
长期补充,建议关注收藏! 定义 特性进程线程定义程序执行的基本单位执行中的最小单位资源拥有独立的内存空间和资源共享进程的资源开销创建和销毁的开销较大创建和销毁的开销较小执行单位进程中可以有多个线程线程是执行单元,必须依赖于进程并…...
BlueLM:以2.6万亿token铸就7B参数超大规模语言模型
一、介绍 BlueLM 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型,本次发布包含 7B 基础 (base) 模型和 7B 对话 (chat) 模型,同时我们开源了支持 32K 的长文本基础 (base) 模型和对话 (chat) 模型。 更大量的优质数据 :高质量语料…...
Webpack学习笔记(4)
1.缓存 可以通过命中缓存降低网络流量,是网站加站速度更快。 然而在部署新版本时,不更改资源的文件名,浏览器可能认为你没有更新,所以会使用缓存版本。 由于缓存存在,获取新的代码成为问题。 接下来将配置webpack使…...
28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强
A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法:无模型水下图像增强方法:基于深度学习的水下图像增强方法: 论文方法概述像素分布…...
5.interview-self-introduction
1.保证电话面试来的时候,可以接听,保持电话通常 interviews will be arranged recently.please keep your phone line open and make sure you can answer th call when the phone interview comes. speak loudly and slow down your speaking voice &a…...
高性能MySQL-查询性能优化
查询性能优化 1、为什么查询这么慢2、慢查询基础:优化数据访问2.1 是否向数据库请求了不需要的数据2.2 MySQL是否存在扫描额外的记录 3、重构查询方式3.1 一个复杂查询还是多个简单查询3.2 切分查询3.3 分解联接查询 4、查询执行的基础4.1 MySQL的客户端/服务器通信…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...
无头浏览器技术:Python爬虫如何精准模拟搜索点击
1. 无头浏览器技术概述 1.1 什么是无头浏览器? 无头浏览器是一种没有图形用户界面(GUI)的浏览器,它通过程序控制浏览器内核(如Chromium、Firefox)执行页面加载、JavaScript渲染、表单提交等操作。由于不渲…...
