Display-Lock:窗口状态锁定技术原理与C#实战

news2026/5/15 8:07:10
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目叫Stateford/Display-Lock。乍一看这个名字可能有点摸不着头脑Stateford听起来像个人名或者组织名Display-Lock直译是“显示锁定”。但当你深入进去会发现它解决的是一个在特定开发场景下尤其是涉及多显示器、远程桌面或者复杂UI状态管理的场景中非常实际且令人头疼的问题如何精确、可靠地控制应用程序窗口的显示状态防止其在不该出现的时候出现或者在不该消失的时候消失。简单来说Display-Lock是一个轻量级的库或工具集它提供了一套机制允许开发者以编程方式“锁定”或“解锁”应用程序的显示输出。这不仅仅是简单的ShowWindow()或HideWindow()调用而是涉及对窗口消息循环、渲染管线、显示器拓扑结构甚至图形驱动层面的更底层干预以确保显示状态的稳定性和一致性。想象一下你正在开发一个金融交易终端一个视频会议软件或者一个工业控制面板窗口的意外闪烁、最小化、被其他窗口遮挡或者在多显示器切换时跑到错误的屏幕上都可能带来灾难性的用户体验或操作风险。Display-Lock就是为了杜绝这类问题而生的。它适合哪些人呢首先肯定是桌面应用开发者特别是那些对应用窗口的“存在感”和“稳定性”有苛刻要求的领域比如专业软件、企业级工具、游戏辅助工具等。其次系统管理员或IT支持人员也可能用它来定制一些特殊的显示策略例如在公共信息屏上锁定某个应用全屏显示。对于我这样的技术爱好者来说研究它的实现原理本身就是一次对Windows/Linux图形子系统、窗口管理器工作机制的深度探索。2. 核心设计思路与架构拆解Display-Lock的设计哲学我认为可以概括为“状态感知”与“强制干预”的结合。它不是简单地暴力隐藏窗口而是建立了一个对显示状态进行监控和管理的中间层。2.1 状态机模型理解“锁定”的本质项目的核心是一个精心设计的状态机。一个应用程序窗口的显示状态是动态的可见、隐藏、最小化、最大化、全屏、失去焦点、被遮挡等等。Display-Lock首先需要精确地感知这些状态。它通常会通过钩子Hooks或事件订阅的方式监听系统的窗口消息如WM_SHOWWINDOW,WM_ACTIVATE,WM_WINDOWPOSCHANGING以及显示设置变更事件如WM_DISPLAYCHANGE。“锁定”在这个模型里意味着将窗口的显示状态锚定在一个开发者期望的目标状态。例如锁定为“全屏且置顶”那么无论用户如何操作尝试AltTab切换、按Windows键、甚至其他程序试图置顶Display-Lock的守护进程或注入的代码都会介入拦截可能导致状态偏离的操作并强制将窗口恢复回锁定的状态。这背后是一系列对窗口样式Window Style、扩展样式Extended Style、Z序Z-Order以及窗口位置/尺寸的持续校正。2.2 分层架构从用户接口到底层驱动为了实现健壮的锁定功能Display-Lock的架构往往是分层的应用层API这是开发者直接接触的部分。通常提供简洁的接口如DisplayLock.Acquire(lockType)和DisplayLock.Release()。lockType可能枚举了多种锁定模式FullscreenLock全屏锁定禁止退出全屏、TopmostLock置顶锁定、VisibilityLock可见性锁定防止最小化或隐藏、MonitorLock显示器锁定将窗口绑定到特定显示器即使显示器拓扑变化。核心引擎层这是大脑。它维护着每个被锁定窗口的状态机处理来自API的请求并决策需要采取哪些纠正措施。它还会管理一个“允许列表”或“例外列表”比如允许通过特定的热键如CtrlAltL来临时解除锁定这对于调试或紧急情况至关重要。平台适配层这是手脚。因为Windows、macOS、Linux以及其下不同的桌面环境如GNOME, KDE的窗口管理机制截然不同。这一层封装了所有平台相关的原生API调用。在Windows上可能大量使用user32.dll的函数如SetWindowPos,SetWindowLongPtr和消息钩子在Linux上则可能需要与X11的Xlib、XCB或者Wayland的协议进行交互。守护进程/服务层可选但推荐对于一些高级锁定模式特别是需要跨进程管理或应对系统级事件如用户切换、锁屏时一个以系统服务或守护进程形式运行的后台组件会更可靠。它可以拥有更高的权限更稳定地监控系统事件并管理多个应用程序的锁定请求。这种分层设计确保了核心逻辑的清晰和平台支持的灵活性是项目能否实用的关键。3. 关键技术实现与难点剖析理解了设计思路我们来看看实现中的一些关键技术和必然会遇到的“坑”。3.1 窗口消息拦截与处理这是最核心的技术点。以Windows为例实现锁定通常需要子类化Subclassing目标窗口或设置全局/线程特定的消息钩子SetWindowsHookEx。// 伪代码示例窗口过程Window Procedure中的关键处理 LRESULT CALLBACK LockedWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_SYSCOMMAND: // 拦截系统命令如SC_MINIMIZE最小化、SC_CLOSE关闭 if (wParam SC_MINIMIZE isLockedPreventMinimize) { // 阻止最小化或者将其转化为其他无害操作 return 0; } break; case WM_WINDOWPOSCHANGING: // 当窗口位置、大小、Z序即将改变时触发 WINDOWPOS* wp (WINDOWPOS*)lParam; if (isLockedToMonitor) { // 强制将窗口位置限制在目标显示器范围内 ClipWindowPosToMonitor(wp); } if (isLockedTopmost !(wp-flags SWP_NOZORDER)) { // 强制将窗口置于最顶层 wp-hwndInsertAfter HWND_TOPMOST; wp-flags ~SWP_NOZORDER; } break; case WM_ACTIVATE: // 窗口激活状态变化 if (wParam WA_INACTIVE isLockedPreventDeactivate) { // 如果锁定为禁止失活则尝试重新激活自己 PostMessage(hWnd, WM_ACTIVATE, WA_ACTIVE, 0); return 0; } break; } // 调用原始窗口过程处理其他消息 return CallOriginalWndProc(hWnd, msg, wParam, lParam); }注意消息拦截需要极高的谨慎。过度拦截或错误处理消息可能导致窗口无法响应、界面卡死甚至影响整个桌面环境的稳定性。必须确保只拦截与锁定目标相关的消息并且对于非目标消息必须原封不动地传递给原始窗口过程。3.2 多显示器与DPI感知处理在现代多显示器且每台显示器DPI可能不同的环境下“将窗口锁定到某个显示器”变得异常复杂。你不能简单地记下一个坐标因为显示器可能被拔掉、重新排列或者缩放比例改变。显示器标识使用EnumDisplayMonitors获取显示器句柄HMONITOR和详细信息而不是依赖容易变化的屏幕索引或坐标。将窗口与一个特定的HMONITOR绑定。DPI感知应用程序必须是DPI感知的Per-Monitor DPI Aware V2否则在高DPI显示器上你的窗口坐标和尺寸计算会完全错乱。在锁定位置和大小时需要将逻辑坐标与物理像素坐标进行正确的转换。拓扑变化监听监听WM_DISPLAYCHANGE消息。当显示器配置改变时需要重新计算目标显示器的边界并将窗口迁移到新的正确位置。如果目标显示器被移除则需要有一个降级策略比如锁定到主显示器或者进入一种“安全模式”并通知用户。3.3 与全屏独占模式的协调许多应用特别是游戏和视频播放器会使用全屏独占模式Fullscreen Exclusive Mode来获得最高性能。这种模式下应用程序直接控制显示器的帧缓冲区绕过了窗口管理器。Display-Lock需要识别这种状态并避免与之冲突。通常的策略是在非游戏类应用中优先使用无边框窗口全屏Borderless Fullscreen Window这更容易被管理。如果检测到应用进入了真正的全屏独占模式Display-Lock可能需要暂时放宽某些限制如Z序锁定或者仅保留“显示器绑定”这一最基础的功能以免引发渲染问题或黑屏。3.4 权限与用户交互一个试图控制其他窗口的软件很容易被安全软件误判为恶意软件如键盘记录器、勒索软件。因此Display-Lock需要有良好的“公民意识”透明性在锁定时应在窗口的某个角落如标题栏显示一个微小的、非侵入性的锁形图标提示用户当前处于锁定状态。逃生通道必须设计一个全局的、优先级极高的解锁热键例如CtrlShiftAltL这个热键的处理应放在消息链的最前端确保在任何锁定状态下都能响应。这个热键最好允许用户自定义。安装与权限如果涉及注入其他进程为了更稳固地锁定非自己创建的窗口可能需要以管理员权限运行这必须在安装和用户协议中明确说明。4. 实战应用构建一个简单的显示器锁定工具理论说了这么多我们动手实现一个简化版的核心功能将一个指定窗口锁定到当前显示器并防止其被最小化。我们以Windows平台使用C#和P/Invoke为例。4.1 环境准备与项目初始化首先创建一个新的C#控制台应用或WPF应用。我们需要引入对Windows API的调用。using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading; // 定义必要的Windows API函数和常量 public class NativeMethods { public delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); [DllImport(user32.dll)] public static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong); [DllImport(user32.dll)] public static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); [DllImport(user32.dll)] public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); [DllImport(user32.dll)] public static extern bool ClipCursor(ref RECT lpRect); [DllImport(user32.dll)] public static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags); [DllImport(user32.dll)] public static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi); public const int GWLP_WNDPROC -4; public const int WM_SYSCOMMAND 0x0112; public const int SC_MINIMIZE 0xF020; public const int WM_WINDOWPOSCHANGING 0x0046; public const uint MONITOR_DEFAULTTONEAREST 2; [StructLayout(LayoutKind.Sequential)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; } [StructLayout(LayoutKind.Sequential)] public struct MONITORINFO { public int cbSize; public RECT rcMonitor; public RECT rcWork; public uint dwFlags; } }4.2 实现窗口子类化与消息过滤我们创建一个WindowLocker类来封装锁定逻辑。public class WindowLocker { private IntPtr _targetHwnd; private IntPtr _originalWndProc; private NativeMethods.WndProcDelegate _hookProc; private IntPtr _lockedMonitorHandle; private NativeMethods.RECT _monitorRect; public bool IsLocked { get; private set; } public WindowLocker(IntPtr windowHandle) { _targetHwnd windowHandle; _hookProc new NativeMethods.WndProcDelegate(HookedWndProc); } public void AcquireLock() { if (_targetHwnd IntPtr.Zero) throw new ArgumentException(Invalid window handle.); if (IsLocked) return; // 1. 获取窗口当前所在的显示器并记录其范围 _lockedMonitorHandle NativeMethods.MonitorFromWindow(_targetHwnd, NativeMethods.MONITOR_DEFAULTTONEAREST); var mi new NativeMethods.MONITORINFO(); mi.cbSize Marshal.SizeOf(mi); if (NativeMethods.GetMonitorInfo(_lockedMonitorHandle, ref mi)) { _monitorRect mi.rcMonitor; } // 2. 子类化窗口替换其窗口过程 _originalWndProc NativeMethods.SetWindowLongPtr( _targetHwnd, NativeMethods.GWLP_WNDPROC, Marshal.GetFunctionPointerForDelegate(_hookProc) ); // 3. 可选将光标限制在当前显示器内增强“锁定”感 // NativeMethods.ClipCursor(ref _monitorRect); IsLocked true; Console.WriteLine($Window 0x{_targetHwnd.ToInt64():X} locked to monitor.); } public void ReleaseLock() { if (!IsLocked) return; // 恢复原始窗口过程 if (_originalWndProc ! IntPtr.Zero) { NativeMethods.SetWindowLongPtr(_targetHwnd, NativeMethods.GWLP_WNDPROC, _originalWndProc); } // 释放光标限制 NativeMethods.RECT fullScreen new NativeMethods.RECT { Left 0, Top 0, Right 65535, Bottom 65535 }; NativeMethods.ClipCursor(ref fullScreen); IsLocked false; Console.WriteLine($Window 0x{_targetHwnd.ToInt64():X} lock released.); } private IntPtr HookedWndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) { switch (msg) { case NativeMethods.WM_SYSCOMMAND: // 拦截最小化命令 int cmd wParam.ToInt32() 0xFFF0; if (cmd NativeMethods.SC_MINIMIZE) { Console.WriteLine(Minimize blocked by lock.); return IntPtr.Zero; // 阻止最小化 } break; case NativeMethods.WM_WINDOWPOSCHANGING: // 这是一个更高级的示例需要解包WINDOWPOS结构。 // 为了简化这里我们用一个定时器或线程来定期校正窗口位置防止被拖走。 // 实际项目中应正确解析lParam并修改其中的坐标和标志位。 break; } // 将所有其他消息传递给原始窗口过程 return NativeMethods.CallWindowProc(_originalWndProc, hWnd, msg, wParam, lParam); } // 一个简单的校正方法在后台线程中定期确保窗口在目标显示器上 public void StartPositionGuard() { Thread guardThread new Thread(() { while (IsLocked) { Thread.Sleep(500); // 每500ms检查一次 NativeMethods.RECT currentRect; if (NativeMethods.GetWindowRect(_targetHwnd, out currentRect)) { // 简单判断窗口中心点是否在锁定显示器内 int centerX (currentRect.Left currentRect.Right) / 2; int centerY (currentRect.Top currentRect.Bottom) / 2; if (centerX _monitorRect.Left || centerX _monitorRect.Right || centerY _monitorRect.Top || centerY _monitorRect.Bottom) { // 如果窗口跑出去了就把它移回来 // 这里调用MoveWindow或SetWindowPos将窗口移动到_monitorRect内 Console.WriteLine(Window drifted, correcting position...); // User32.MoveWindow(...); } } } }); guardThread.IsBackground true; guardThread.Start(); } }4.3 使用示例与测试class Program { static void Main(string[] args) { Console.WriteLine(Enter the process name or PID of the window to lock (e.g., notepad):); string input Console.ReadLine(); Process targetProcess null; if (int.TryParse(input, out int pid)) { targetProcess Process.GetProcessById(pid); } else { var processes Process.GetProcessesByName(input); targetProcess processes.Length 0 ? processes[0] : null; } if (targetProcess null || targetProcess.MainWindowHandle IntPtr.Zero) { Console.WriteLine(Cannot find the target window.); return; } var locker new WindowLocker(targetProcess.MainWindowHandle); locker.AcquireLock(); locker.StartPositionGuard(); // 启动位置守护线程 Console.WriteLine(Lock is active. Press any key to release lock and exit.); Console.ReadKey(); locker.ReleaseLock(); } }这个示例虽然简单但涵盖了子类化、消息拦截、显示器信息获取等核心概念。你可以运行它然后尝试去最小化你锁定的记事本窗口会发现点击最小化按钮无效。5. 常见问题、调试技巧与进阶思考在实际使用或借鉴Display-Lock思想进行开发时你会遇到各种各样的问题。5.1 典型问题与排查清单问题现象可能原因排查思路与解决方案锁定后窗口无响应、卡死消息钩子或子类化过程处理不当阻塞或破坏了消息循环。1. 检查钩子过程WndProc是否对所有非目标消息都正确调用了CallWindowProc。2. 确保没有在消息处理中进行耗时操作如网络请求、复杂计算耗时操作应异步处理。3. 使用Spy或类似工具查看目标窗口的消息流确认你的钩子是否导致消息丢失。锁定无效窗口仍可被最小化/移动1. 钩子安装失败权限不足、句柄无效。2. 拦截的消息类型不对。某些应用使用非标准方式改变状态。3. 多线程窗口主窗口和实际UI窗口句柄不同。1. 检查SetWindowLongPtr的返回值确认安装成功。2. 扩大消息拦截范围尝试拦截WM_SIZE、WM_MOVE等更多消息。3. 使用EnumChildWindows遍历找到真正的“视图”窗口句柄进行锁定。在多显示器环境下锁定到错误屏幕1. 显示器拓扑变化后未更新。2. DPI缩放导致坐标计算错误。3. 使用屏幕索引而非显示器句柄HMONITOR。1. 监听WM_DISPLAYCHANGE并在事件发生时重新获取并更新_lockedMonitorHandle和_monitorRect。2. 确保你的应用清单文件声明了正确的DPI感知级别Per-Monitor DPI Aware。3.始终使用HMONITOR作为显示器的唯一标识。安全软件报警或拦截行为类似恶意软件注入、钩子、光标限制。1. 为你的程序申请数字签名。2. 在程序说明和用户协议中清晰阐述功能。3. 提供明显的视觉反馈如锁图标和便捷的退出方式。4. 考虑以白名单方式向主流安全软件提交你的应用。与游戏/全屏应用冲突游戏通常使用独占全屏接管了图形输出。1. 检测到目标窗口进入全屏独占模式后自动暂停大部分锁定功能如Z序调整只保留基础的“状态记录”。2. 引导用户使用“无边框窗口全屏”模式该模式下兼容性更好。5.2 调试技巧像侦探一样排查问题使用 Spy (Windows SDK 工具)这是窗口消息调试的瑞士军刀。用它找到目标窗口的精确句柄查看其收到的所有消息以及消息参数能直观地看到你的钩子是否生效以及消息流是否正常。日志记录在你的钩子函数或核心逻辑中加入详细的日志输出记录关键消息、函数调用结果和状态变化。文件日志比控制台输出更可靠尤其是在程序出现异常时。分阶段测试不要一次性实现所有锁定功能。先实现“防止最小化”测试稳定后再加“置顶”最后实现“多显示器绑定”。这样当问题出现时你能快速定位到是哪个新加的功能引入的。处理异常与恢复你的锁定代码必须非常健壮。任何异常都应被捕获并尽可能安全地恢复到未锁定状态即调用ReleaseLock。否则一个崩溃的钩子可能导致目标程序乃至整个桌面环境不稳定。5.3 进阶方向与扩展思考如果你觉得基础锁定已经满足还可以探索这些更酷的方向远程桌面与虚拟通道在远程桌面RDP或虚拟桌面环境下显示逻辑完全不同。研究如何在这些环境中保持窗口的“存在”可能需要用到虚拟通道Virtual Channel技术来同步状态。基于策略的自动化锁定结合配置文件或简单的脚本实现诸如“当运行A程序时自动将B程序锁定在副屏并置顶”的自动化场景。与现代化UI框架集成为WPF、WinUI 3、Electron等框架提供原生封装。例如为WPF窗口提供一个DisplayLock.IsLocked的附加属性在XAML中直接声明。性能与资源考量持续运行的校正线程或高频消息钩子会消耗资源。需要优化检查频率例如使用SetWinEventHook监听特定事件而非轮询并在不需要时及时释放资源。Display-Lock这类项目其魅力在于它游走在应用层与系统层的边界上。实现它不仅能解决一个具体的痛点更能让你对操作系统图形子系统的工作原理有更深的理解。从简单的消息拦截开始逐步深入到多显示器管理、DPI感知、权限与交互设计每一步都是对开发者综合能力的考验。希望这篇从原理到实战的拆解能为你打开一扇窗当你下次需要让某个窗口“老老实实”待在该在的地方时知道该从何下手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2614619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…