WPF应用开机自启动实现:注册表与启动文件夹的C#实战指南
1. 项目缘起为什么WPF应用需要开机自启动做桌面应用开发特别是工业上位机、数据监控或者个人效率工具经常会遇到一个刚需用户希望软件能在电脑开机后自动启动而不是每次都要手动去双击图标。对于C# WPF项目来说这个需求尤其普遍。想象一下一个工厂车间的数据采集看板或者一个家庭用的智能家居控制中心如果每次断电重启后都需要人工干预启动那可靠性和用户体验就会大打折扣。开机自启动本质上是一个系统级的配置行为与应用本身的业务逻辑是解耦的。它不关心你的WPF界面有多炫酷业务逻辑有多复杂它只解决“如何让一个可执行文件在用户登录后自动运行”这个问题。在Windows环境下实现这个目标主要有两大“传统艺能”修改注册表和利用系统启动文件夹。最近几年随着Windows 10/11任务管理器的进化通过它来管理启动项也成了一个直观的入口。但作为开发者我们需要的是能以编程方式、稳定可靠地完成这个配置并且最好能处理不同Windows版本之间的细微差异。我接手过不少遗留的WPF项目发现很多团队在实现自启动时代码写得非常随意要么权限问题没处理好导致在非管理员账户下失效要么路径处理不严谨换了安装目录就“失忆”。更常见的是只实现了“添加”没好好实现“移除”和“状态查询”导致卸载不干净或者设置界面无法正确显示当前状态。所以这次我们不只讲“怎么做”更要拆解“为什么这么做”以及“怎么做得更稳健”。2. 核心原理Windows开机自启动的机制剖析要写好自启动功能不能只当一个API调用工得先明白Windows是怎么管理这些开机任务的。这样当出现“为什么我设置了却没生效”这种问题时你才能有的放矢地去排查。2.1 注册表最经典也是最底层的通道Windows注册表是一个庞大的配置数据库其中专门有一个路径用来管理当前用户的登录启动项HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run当用户登录时Windows Shell通常是explorer.exe会读取这个注册表项下的所有键值。每个键的名称可以任意通常用应用名键值则必须是一个可执行文件的完整绝对路径。系统会尝试依次执行这些路径指向的程序。为什么是HKEY_CURRENT_USER因为它只对当前登录的用户生效。这意味着你用A账户设置的自启动换B账户登录是不会运行的。这提供了用户级别的隔离对于多用户环境的电脑来说更安全、更合理。与之对应的是HKEY_LOCAL_MACHINE下的Run项它对本机所有用户生效但写入它通常需要管理员权限且可能引发安全软件的警告对于普通桌面应用我们优先使用当前用户项。路径的“坑”注册表里存的是字符串。如果你直接把“MyApp.exe”这样的相对路径写进去系统在启动时根本找不到它。必须使用如“C:\Program Files\MyApp\MyApp.exe”这样的绝对路径。这就引出了如何动态、可靠地获取当前程序路径的问题。2.2 启动文件夹更“可视化”的替代方案除了注册表每个用户还有一个专用的启动文件夹。它的路径通常是C:\Users\[用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup你放到这个文件夹里的快捷方式.lnk文件或可执行文件在用户登录后也会被自动执行。从效果上看它和当前用户的注册表Run项几乎一样。两种方式的细微差别管理界面启动文件夹里的内容用户可以在文件管理器中直接看到、删除或添加对普通用户更友好。注册表项则相对隐蔽需要通过regedit或任务管理器查看。执行顺序有资料表明注册表Run项的处理可能略早于启动文件夹但这个时间差对于大多数应用来说可以忽略不计。实现复杂度编程方式操作启动文件夹本质上是文件操作创建/删除快捷方式。而操作注册表是调用特定的Win32 API或.NET封装。从代码简洁性看注册表方式通常更直接。2.3 任务管理器中的“启动”选项卡这是Windows 8之后提供的一个管理界面。它实际上是一个上述两种自启动项的“展示层”。你在这里禁用某个项目系统可能会在对应的注册表项或启动文件夹中做一个禁用标记例如在注册表值前加特定前缀而不是删除它。作为开发者我们通常不直接与这个界面交互但要知道用户可能从这里管理你的应用因此我们的设置/取消操作应该能同步反映在这里的状态上。理解了这些机制我们就知道编程实现的核心就是安全地、正确地写入或删除一个包含正确路径的注册表键值或者在启动文件夹创建/删除一个指向正确目标的快捷方式。3. 实战基于注册表的自启动实现详解这是最常用、代码最集中的方法。我们将一步步构建一个健壮的自启动辅助类。3.1 获取应用程序的可执行文件路径这是第一步也是容易出错的一步。你不能想当然地使用Environment.CurrentDirectory或者new FileInfo(“MyApp.exe”)因为这些在开发环境和安装后可能完全不同。可靠的方法是使用Process.GetCurrentProcess().MainModule.FileName或者Assembly.GetEntryAssembly().Location。using System.Diagnostics; using System.Reflection; public static string GetExecutablePath() { // 方法一通过当前进程主模块 // string path Process.GetCurrentProcess().MainModule.FileName; // 方法二通过入口程序集更常用不依赖进程模块 string path Assembly.GetEntryAssembly().Location; return path; }注意Assembly.GetEntryAssembly()在少数特定宿主环境下如某些单元测试框架可能返回null但在标准的WPF应用程序中它是完全可靠的。我建议在程序启动后尽早将这个路径保存到一个静态变量中备用。3.2 操作注册表的核心代码.NET 提供了Microsoft.Win32.Registry类来操作注册表。我们需要用到Registry.CurrentUser来打开当前用户配置单元。using Microsoft.Win32; using System.IO; public class StartupManager { // 定义注册表路径常量 private const string RunRegistryPath Software\Microsoft\Windows\CurrentVersion\Run; // 定义你的应用在注册表中的键名确保唯一性 private const string AppRegistryKeyName MyWpfApplication; /// summary /// 启用开机自启动写入注册表 /// /summary /// returns操作是否成功/returns public static bool EnableStartup() { try { string exePath GetExecutablePath(); // 打开或创建注册表项 using (RegistryKey key Registry.CurrentUser.OpenSubKey(RunRegistryPath, true)) { if (key null) { // 理论上这个路径应该存在如果不存在则创建极少数情况 using (RegistryKey newKey Registry.CurrentUser.CreateSubKey(RunRegistryPath)) { newKey.SetValue(AppRegistryKeyName, exePath); } } else { // 直接设置值 key.SetValue(AppRegistryKeyName, exePath); } } return true; } catch (UnauthorizedAccessException) { // 权限不足虽然HKCU一般不会但某些系统策略可能限制 // 可以记录日志或通知用户 return false; } catch (Exception ex) { // 其他异常如路径无效等 // 记录日志: ex.Message return false; } } /// summary /// 禁用开机自启动从注册表删除 /// /summary /// returns操作是否成功/returns public static bool DisableStartup() { try { using (RegistryKey key Registry.CurrentUser.OpenSubKey(RunRegistryPath, true)) { if (key ! null) { // 如果键存在则删除它 key.DeleteValue(AppRegistryKeyName, false); // false表示如果值不存在也不抛出异常 } } return true; } catch (Exception ex) { // 记录日志 return false; } } /// summary /// 检查当前是否已设置开机自启动 /// /summary /// returnstrue表示已设置/returns public static bool IsStartupEnabled() { try { using (RegistryKey key Registry.CurrentUser.OpenSubKey(RunRegistryPath, false)) { if (key ! null) { object value key.GetValue(AppRegistryKeyName); if (value ! null) { string currentPath value.ToString(); string actualPath GetExecutablePath(); // 重要不仅检查键是否存在还要检查路径是否一致。 // 防止用户移动了程序位置导致注册表项失效。 return string.Equals(currentPath, actualPath, StringComparison.OrdinalIgnoreCase); } } } return false; } catch { return false; } } }代码关键点解析using语句RegistryKey实现了IDisposable使用using确保即使发生异常注册表句柄也能被正确关闭避免资源泄漏。路径比较在IsStartupEnabled中我们不仅检查键是否存在还比较存储的路径和当前程序的实际路径。这是因为用户可能重命名、移动了程序文件如果路径不一致那个自启动项实际上是无效的系统会报错或静默失败。我们的检查逻辑认为这种情况等同于“未设置”这样在UI上可以提供一个“修复”或“重新设置”的选项。异常处理注册表操作可能因权限、键被锁定等原因失败。务必进行基本的异常捕获并向用户返回一个明确的操作结果成功/失败而不是让程序崩溃。在生产环境中应将异常信息记录到日志文件以便排查。3.3 处理带命令行参数的自启动有时候我们希望在开机启动时传递一些参数给应用程序比如以最小化模式启动 (/minimized)或者加载特定配置。实现这个功能很简单只需要在写入注册表时将路径和参数拼接成一个完整的字符串即可。public static bool EnableStartupWithArgs(string arguments ) { try { string exePath GetExecutablePath(); string fullCommand string.IsNullOrEmpty(arguments) ? exePath : $\{exePath}\ {arguments}; using (RegistryKey key Registry.CurrentUser.OpenSubKey(RunRegistryPath, true)) { key?.SetValue(AppRegistryKeyName, fullCommand); } return true; } catch { return false; } }重要提示当路径包含空格时如C:\Program Files\My App\app.exe必须用双引号将路径括起来否则系统在解析命令行时会出错。上面的代码通过$\\{exePath}\\确保了这一点。即使没有参数养成用双引号包裹路径的习惯也是个好实践。4. 进阶议题与深度避坑指南把基础的代码跑通只是第一步。在实际项目部署中你会遇到更多边界情况和“坑”。4.1 权限问题为什么有时设置会失败虽然操作HKEY_CURRENT_USER通常不需要管理员权限但在以下情况下可能失败用户配置文件损坏或权限被组策略限制某些企业环境通过组策略禁止用户修改Run键。你的代码会抛出UnauthorizedAccessException。对于这种情况作为应用开发者能做的有限可以提示用户“可能被系统策略禁止”。防病毒软件或安全软件拦截一些安全软件会监控对自启动项的修改并弹出警告询问用户。如果你的应用没有数字签名或不被信任可能会被阻止。给你的EXE文件进行代码签名能极大提升信任度减少此类干扰。程序自身路径权限如果你把程序安装在C:\Program Files下而当前用户对该目录没有写入权限这本身不影响注册表操作但会影响程序后续的运行例如写日志文件。这不是自启动的问题是安装目录选择的问题。实操建议在应用设置界面提供一个“尝试修复”或“以管理员身份重新设置”的按钮如果需要且合理。但注意不应默认要求管理员权限这会影响用户体验。4.2 路径解析的“幽灵”问题这是最隐蔽的坑之一。考虑这个场景你的程序通过快捷方式启动并且快捷方式的“起始位置”属性被设置为了一个特定工作目录。此时Assembly.GetEntryAssembly().Location返回的依然是exe的真实路径这没问题。但如果你在程序内用相对路径访问一些资源文件而自启动时系统是以System32目录或其他目录作为工作目录启动你的程序那些相对路径就会失效。解决方案始终使用绝对路径访问资源不要依赖Environment.CurrentDirectory。对于配置文件、资源文件等使用基于应用程序基目录AppDomain.CurrentDomain.BaseDirectory或可执行文件所在目录Path.GetDirectoryName(GetExecutablePath())来构造绝对路径。在程序启动的早期如App.xaml.cs的OnStartup方法中可以显式地设置当前目录Directory.SetCurrentDirectory(Path.GetDirectoryName(GetExecutablePath()));。但这是一种全局修改需谨慎评估对代码其他部分的影响。4.3 多实例运行与自启动如果你的应用设计为只允许运行一个实例单例应用那么自启动时需要做好检查。通常我们使用Mutex互斥锁来实现单例。在App.xaml.cs中protected override void OnStartup(StartupEventArgs e) { bool isNewInstance; Mutex mutex new Mutex(true, Global\\MyUniqueAppMutexName, out isNewInstance); if (!isNewInstance) { // 已经有一个实例在运行了 // 这里可以激活已存在的窗口然后关闭自己 MessageBox.Show(程序已经在运行中。); mutex?.Dispose(); Shutdown(); return; } // 第一个实例继续正常启动 // 注意不要释放这个Mutex直到程序退出 // 可以将其存储在应用程序级资源中 Application.Current.Properties[SingletonMutex] mutex; base.OnStartup(e); }这样无论是用户双击启动还是开机自动启动都能保证只有一个进程实例。记得在应用退出时释放Mutex。4.4 安装程序与自启动的设置时机对于需要安装的WPF应用通常不建议在第一次运行时由程序自己来设置自启动。更好的做法是在安装程序如MSI安装包中完成这个配置。这样更符合用户预期安装时询问“是否开机启动”而不是第一次运行程序时突然修改系统设置。使用WiX Toolset或InstallShield等安装工具你可以在安装流程中添加一个动作来写入注册表。卸载时安装程序也会负责清理这个注册表项确保卸载干净。如果你的应用是“便携版”或希望由用户决定那么在应用的“设置”界面提供一个开关调用我们上面写的StartupManager类是更合适的。5. 替代方案使用启动文件夹与任务计划程序虽然注册表是主流但了解替代方案能让你在特定场景下有更多选择。5.1 通过启动文件夹设置这种方法的核心是创建一个指向你程序的快捷方式.lnk文件并将其复制到用户的启动文件夹。using IWshRuntimeLibrary; // 需要引用 COM 组件“Windows Script Host Object Model” using System.IO; public static bool EnableStartupViaStartupFolder() { try { string startupFolderPath Environment.GetFolderPath(Environment.SpecialFolder.Startup); string shortcutPath Path.Combine(startupFolderPath, ${AppRegistryKeyName}.lnk); string exePath GetExecutablePath(); WshShell shell new WshShell(); IWshShortcut shortcut (IWshShortcut)shell.CreateShortcut(shortcutPath); shortcut.TargetPath exePath; shortcut.WorkingDirectory Path.GetDirectoryName(exePath); // 设置工作目录避免路径问题 shortcut.Description My WPF Application; // shortcut.IconLocation exePath ,0; // 可以设置图标 shortcut.Save(); return true; } catch { return false; } } public static bool DisableStartupViaStartupFolder() { try { string startupFolderPath Environment.GetFolderPath(Environment.SpecialFolder.Startup); string shortcutPath Path.Combine(startupFolderPath, ${AppRegistryKeyName}.lnk); if (File.Exists(shortcutPath)) { File.Delete(shortcutPath); } return true; } catch { return false; } }优缺点对比优点对用户更透明他们可以在文件管理器中直接看到并管理。某些极端情况下绕过了一些对注册表的严格监控。缺点需要依赖IWshRuntimeLibrary这个COM组件在非Windows环境或某些精简系统上可能不可用。代码量稍多。5.2 使用任务计划程序高级且灵活Windows任务计划程序是一个强大的系统工具它可以实现比简单“登录时运行”复杂得多的触发条件例如定时、空闲时、特定事件发生时启动。通过编程调用Task Scheduler API可以实现高度定制化的自启动。但是其APITaskScheduler类库或直接调用COM接口TaskScheduler 1.0 Type Library相对复杂且创建任务通常需要管理员权限。对于绝大多数“用户登录即启动”的需求这属于杀鸡用牛刀增加了不必要的复杂度和安全提示。除非你有延迟启动、按条件启动等特殊需求否则不建议采用。6. 在WPF界面中集成一个完整的设置模块示例现在我们把上面的逻辑集成到一个WPF程序的设置窗口中。假设我们有一个SettingsViewModel遵循MVVM模式和一个对应的视图。ViewModel部分using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows.Input; public class SettingsViewModel : INotifyPropertyChanged { private bool _isStartupEnabled; public bool IsStartupEnabled { get _isStartupEnabled; set { if (SetField(ref _isStartupEnabled, value)) { // 属性改变时尝试更新实际设置 ApplyStartupSetting(value); } } } public ICommand CheckStartupCommand { get; } public SettingsViewModel() { // 初始化时检查当前状态 _isStartupEnabled StartupManager.IsStartupEnabled(); // 也可以提供一个手动检查的命令 CheckStartupCommand new RelayCommand(() { IsStartupEnabled StartupManager.IsStartupEnabled(); // 可以在这里提示用户当前状态已刷新 }); } private void ApplyStartupSetting(bool enable) { bool success; if (enable) { success StartupManager.EnableStartup(); } else { success StartupManager.DisableStartup(); } if (!success) { // 操作失败回滚UI状态并通知用户 System.Windows.Application.Current.Dispatcher.Invoke(() { _isStartupEnabled !enable; // 回滚到之前的状态 OnPropertyChanged(nameof(IsStartupEnabled)); MessageBox.Show(修改开机启动设置失败可能是权限不足或系统限制。, 操作失败, MessageBoxButton.OK, MessageBoxImage.Warning); }); } else { // 操作成功可以给出轻量提示可选 // System.Windows.MessageBox.Show(设置已更新。); } } // INotifyPropertyChanged 实现 public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName null) PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); protected bool SetFieldT(ref T field, T value, [CallerMemberName] string propertyName null) { if (EqualityComparerT.Default.Equals(field, value)) return false; field value; OnPropertyChanged(propertyName); return true; } }View部分 (XAML):Window x:ClassMyApp.Views.SettingsWindow xmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml Title设置 Height300 Width400 StackPanel Margin20 GroupBox Header开机启动 StackPanel CheckBox IsChecked{Binding IsStartupEnabled, ModeTwoWay} Content开机时自动启动 MyApp Margin5/ TextBlock TextWrappingWrap Margin5,10,5,0 ForegroundGray FontSize12 启用后MyApp将在您登录Windows时自动启动。 /TextBlock Button Content手动检查当前状态 Command{Binding CheckStartupCommand} Margin5,15,5,5 Padding10,3/ /StackPanel /GroupBox /StackPanel /Window这样用户就可以通过一个简单的复选框来控制开机自启动功能ViewModel会处理与后台StartupManager的交互并在操作失败时给出反馈。7. 调试与排查当自启动不生效时怎么办即使代码看起来完美在实际部署中也可能遇到自启动失败的情况。这里有一套排查流程第一步检查注册表项是否存在且路径正确打开注册表编辑器 (regedit)导航到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run。找到以你应用命名的键双击查看它的“数值数据”。核对路径这个路径必须和你程序实际的安装路径完全一致包括大小写不过Windows路径通常不区分。检查是否有多余的空格、引号不匹配等问题。检查路径有效性将数值数据复制到文件资源管理器的地址栏看是否能正确打开程序所在文件夹。第二步检查程序启动逻辑自启动的程序其启动环境工作目录、环境变量可能与手动双击启动不同。在程序启动最开始的地方将Environment.CurrentDirectory、命令行参数(Environment.GetCommandLineArgs()) 等关键信息记录到日志文件中。对比手动启动和自启动时的日志差异。第三步查看系统事件日志如果程序在自启动时崩溃了你可能看不到任何界面。打开“事件查看器”eventvwr.msc查看“Windows日志 - 应用程序”中在你登录时间点附近是否有来自你的程序的错误事件。这能帮你发现因缺少依赖如某个DLL、权限问题或未处理异常导致的启动失败。第四步使用任务管理器验证重启电脑并登录后立即打开任务管理器CtrlShiftEsc切换到“启动”选项卡。找到你的应用查看其“状态”是否为“已启用”。如果被禁用可能是用户或安全软件禁用了它。第五步考虑延迟启动有时自启动失败是因为系统启动时负载过高或某些依赖服务如网络尚未就绪。一个简单的补救措施是让程序在启动后延迟几秒再执行主逻辑。可以在App.xaml.cs的OnStartup中在初始化主窗口前加入await Task.Delay(5000);。更优雅的做法是使用任务计划程序设置延迟触发器但这超出了简单自启动的范畴。我个人的经验是90%的自启动问题都出在第一步的路径错误上。尤其是当程序通过安装包安装到Program Files后开发者本机测试用的是bin\Debug路径两者不一致又没有做好路径的动态获取导致注册表里写的是一个无效路径。所以反复验证GetExecutablePath()函数在目标环境下的返回值是解决问题的关键。

相关新闻

G-Helper:华硕笔记本全面掌控终极解决方案

G-Helper:华硕笔记本全面掌控终极解决方案

G-Helper:华硕笔记本全面掌控终极解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertbook, R…

2026/10/21 14:24:31 阅读更多 →
5分钟快速上手微信公众号爬虫:3个实战技巧获取文章数据、阅读量和点赞数

5分钟快速上手微信公众号爬虫:3个实战技巧获取文章数据、阅读量和点赞数

5分钟快速上手微信公众号爬虫:3个实战技巧获取文章数据、阅读量和点赞数 【免费下载链接】wechat_articles_spider 微信公众号文章的爬虫 项目地址: https://gitcode.com/gh_mirrors/we/wechat_articles_spider 微信公众号爬虫是数据分析师和运营人员必备的数…

2026/10/22 18:19:56 阅读更多 →
2026年pdf合并网站实测盘点:这几款在线合并与拆分工具各有什么特点

2026年pdf合并网站实测盘点:这几款在线合并与拆分工具各有什么特点

上个月报销差旅费,财务要求把所有票据按时间顺序合并成一个PDF上传。我手里散落着机票行程单、酒店水单、打车发票,格式五花八门——有的从邮箱下载,有的是手机截图,还有两张是同事转发的扫描件。文件名乱成一团,手动排…

2026/10/21 19:58:53 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/22 10:18:38 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/22 11:01:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/22 9:44:47 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/22 10:40:08 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/22 10:56:37 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/21 21:32:28 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:50:56 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:51:55 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 16:24:48 阅读更多 →