news 2026/8/3 17:03:24

Windows 10下UE4项目文件右键菜单丢失的深度修复与预防指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows 10下UE4项目文件右键菜单丢失的深度修复与预防指南

1. 项目概述:当UE4项目文件失去“灵魂”

如果你是一名使用虚幻引擎4(UE4)进行游戏开发或实时内容创作的开发者,那么你肯定对.uproject文件再熟悉不过了。这个小小的文件,是通往一个完整虚幻项目的入口,双击它就能唤起编辑器,开始你的创作之旅。然而,在Windows 10系统上,很多开发者都遭遇过一个令人抓狂的“灵异事件”:某天醒来,或者在一次系统更新、安全扫描之后,.uproject文件的右键菜单里,那些至关重要的选项——比如“Generate Visual Studio project files”(生成Visual Studio项目文件)、“Switch Unreal Engine version...”(切换虚幻引擎版本)——突然消失了。右键菜单变得空空如也,只剩下一些通用的“打开”、“编辑”选项,仿佛这个文件失去了与虚幻引擎关联的“灵魂”。

这个问题并非个例,它背后往往站着一位“热心过头”的守护者——Windows安全中心(特别是其中的“病毒和威胁防护”功能)。为了所谓的“系统安全”,它有时会“误伤”一些关键的注册表项,而这些注册表项正是Windows系统用来识别特定文件类型(如.uproject)并为其关联正确右键菜单的“身份证”和“说明书”。当这些注册表信息被清除或损坏,系统就不知道该如何处理.uproject文件了,自然也就无法显示那些专属于UE4的右键功能。

本篇文章,我将从一个资深UE4开发者的角度,带你彻底弄懂这个问题的来龙去脉。我们不仅会手把手教你如何一步步手动恢复被“误杀”的右键菜单,更会提供一个我精心编写、经过多次实战检验的注册表修复脚本。这个脚本能一键修复问题,并附带了详细的原理注释和操作指南,让你不仅能“治好病”,更能“懂病理”,未来再遇到类似问题也能从容应对。

2. 问题根源深度剖析:安全中心与注册表的“爱恨情仇”

要解决问题,首先要理解问题是如何产生的。Windows的右键菜单,本质上是由系统注册表(Registry)来管理和定义的。注册表就像一个庞大的中央数据库,存储着操作系统和所有应用程序的配置信息。对于文件关联和上下文菜单,有几个关键的注册表路径扮演着核心角色。

2.1 注册表如何定义右键菜单

当我们安装虚幻引擎时,安装程序会向注册表中写入一系列信息,告诉系统:“.uproject文件归我管”。这些信息主要存放在以下位置:

  1. 文件类型关联(HKEY_CLASSES_ROOT.uproject):这个键值定义了.uproject扩展名的“类标识符”(Class Identifier)。简单来说,就是给所有.uproject文件起了一个统一的“姓氏”,比如可能叫“UnrealProject.1”。
  2. 类标识符的具体定义(HKEY_CLASSES_ROOT\UnrealProject.1):在这个以“姓氏”命名的键下,定义了这类文件的详细信息。其中最关键的子键是shellshellex
    • shell:这里定义了基础的右键菜单项。例如,shell\GenerateProjectFiles\command就定义了“Generate Visual Studio project files”这个菜单项被点击时,系统应该执行什么命令(通常是调用一个特定的.bat脚本)。
    • shellex\ContextMenuHandlers:这里用于存放更复杂的、由COM组件处理的上下文菜单项。一些高级的集成功能可能会放在这里。

2.2 Windows安全中心的“误操作”机制

Windows安全中心,特别是其“受控文件夹访问”或实时保护中的“勒索软件防护”等功能,其设计初衷是防止恶意软件篡改关键的系统文件和用户文档。它会监控对特定目录(如文档、桌面、下载目录)以及系统关键区域(如注册表)的写入行为。

问题就出在它的判断逻辑上。安全中心有时会将某些合法的注册表修改行为,误判为可疑活动。尤其是当:

  • 第三方安装/卸载程序行为非常规:一些绿色版软件或手动清理工具修改注册表的方式可能触发警报。
  • 注册表项路径或数据“看起来”异常:如果某个键值包含调用命令行脚本(.bat,.cmd)或可执行文件(.exe)的路径,而该路径又不在安全中心的白名单内,就可能被标记。
  • 系统更新或清理后:大型系统更新或使用某些“优化”软件清理注册表后,可能会破坏原有的关联结构,而安全中心在后续扫描中可能会将残留的或损坏的项视为威胁进行“修复”(实为删除)。

当安全中心决定“保护”你时,它采取的行动往往是直接删除它认为有问题的注册表项。对于.uproject的关联来说,这通常意味着HKEY_CLASSES_ROOT\.uprojectHKEY_CLASSES_ROOT\UnrealProject.1下的部分或全部子键被移除。失去了这些定义,右键菜单自然就失效了。

注意:并非所有右键菜单丢失都是安全中心所为。手动误删注册表、安装多个版本UE导致冲突、用户账户控制(UAC)权限问题、甚至磁盘错误都可能导致类似现象。但根据社区反馈和大量案例统计,Windows 10安全中心是导致此问题的“头号嫌疑人”。

2.3 影响范围与症状确认

这个问题的影响非常直接:你无法通过右键菜单快速执行项目相关的关键操作。你必须先打开Epic Games Launcher,或者找到引擎目录下的对应工具来生成项目文件,效率大打折扣。

如何确认是注册表关联问题?

  1. 右键点击一个.uproject文件,查看菜单。如果只有“打开”、“编辑”(用记事本打开)、“剪切复制粘贴”等通用选项,而没有UE4相关的任何选项,这是典型症状。
  2. 尝试双击.uproject文件。如果系统弹出“你要如何打开此文件?”的对话框,让你选择程序,这进一步证实了文件关联已丢失。
  3. 检查默认打开程序:右键文件 -> 属性,看“打开方式”是否还是“Unreal Engine Editor”或类似的描述。如果不是,或者显示为未知应用,也指向关联损坏。

3. 手动修复指南:深入注册表腹地

在祭出“一键修复”脚本之前,我强烈建议你跟随我手动操作一遍。这不仅能让你彻底理解修复原理,在未来遇到其他软件类似的关联问题时,你也能举一反三。请放心,只要严格遵循步骤,操作注册表是安全的。当然,在进行任何注册表修改前,务必备份!

3.1 准备工作与安全须知

  1. 备份注册表:这是铁律。按下Win + R,输入regedit并回车打开注册表编辑器。在菜单栏点击“文件” -> “导出”,选择“全部”,保存一个.reg文件到安全的位置(如桌面)。如果操作失误,可以双击这个文件还原。
  2. 关闭实时保护(临时):为了避免我们修复时再次被安全中心干扰,可以暂时关闭它。进入“设置” -> “更新和安全” -> “Windows 安全中心” -> “病毒和威胁防护”,在“病毒和威胁防护设置”下点击“管理设置”,暂时关闭“实时保护”。修复完成后,请务必重新打开它!
  3. 以管理员身份运行:后续所有需要权限的操作,请确保在管理员权限下进行。

3.2 第一步:重建文件类型关联

我们的目标是重新建立.uproject扩展名到特定“类”的映射。

  1. 打开注册表编辑器 (regedit)。
  2. 导航到路径:计算机\HKEY_CLASSES_ROOT
  3. 在左侧树状图中,查找是否存在.uproject项。如果存在,先右键点击它,选择“权限”,确保当前用户(或Administrators组)有“完全控制”权限。如果没有,你需要先取得所有权并设置权限(此过程略复杂,若遇到可先尝试后续步骤,若失败再处理权限)。
  4. 如果.uproject项不存在,就在HKEY_CLASSES_ROOT上右键 -> 新建 -> 项,将其命名为.uproject(注意开头有个点)。
  5. 选中新建的.uproject项,在右侧窗格双击“(默认)”字符串值。
  6. 将其数值数据设置为一个类名,例如UnrealProject.1。这个名称可以自定义,但需要与下一步对应。点击“确定”。

操作意图:这一步是告诉系统:“所有以.uproject结尾的文件,都属于一个叫做‘UnrealProject.1’的类别。”

3.3 第二步:定义该文件类的行为(关键步骤)

现在,我们需要定义这个“UnrealProject.1”类别具体有哪些行为,特别是右键菜单。

  1. HKEY_CLASSES_ROOT下,查看是否存在UnrealProject.1项。如果不存在,就像上一步一样新建它。
  2. 选中UnrealProject.1项,将其右侧“(默认)”值的数据设置为友好的描述,例如Unreal Engine Project File
  3. UnrealProject.1项上右键 -> 新建 -> 项,命名为DefaultIcon。这个键用于定义文件图标。在其右侧“(默认)”值中,填入UE4编辑器图标的路径,例如"C:\Program Files\Epic Games\UE_4.27\Engine\Binaries\Win64\UnrealVersionSelector.exe,0"。你可以根据自己安装的引擎版本调整路径。
  4. UnrealProject.1项下,新建一个名为shell的项。
  5. shell项下,新建一个子项,命名为GenerateProjectFiles。这个名称会显示在右键菜单中。你可以将其右侧“(默认)”值设为希望在菜单中显示的文字,如Generate Visual Studio project files。如果留空,则显示项名(GenerateProjectFiles)。
  6. GenerateProjectFiles项下,新建一个名为command的项。选中command,将其右侧“(默认)”值设置为生成项目文件命令的实际路径。例如:"C:\Program Files\Epic Games\UE_4.27\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.exe" -projectfiles -project="%1" -game -rocket -progress请注意:这是旧版引擎的命令。对于较新的UE4版本(大约4.24之后),更常见的命令是调用UnrealVersionSelector.exe"C:\Program Files\Epic Games\UE_4.27\Engine\Binaries\Win64\UnrealVersionSelector.exe" /projectfiles "%1"你需要根据自己引擎的安装路径和版本进行调整。%1是一个参数,代表你右键点击的那个.uproject文件的完整路径。
  7. 同理,你可以在shell下创建其他菜单项,比如SwitchVersion,并在其command中设置调用UnrealVersionSelector.exe的相应参数。

实操心得:最可靠的方法是参考一台正常工作的电脑上的注册表配置,或者直接使用Epic Games官方安装程序创建的项。手动编写命令时,路径和参数务必准确,特别是引号和空格。UnrealVersionSelector.exe是管理这些关联的官方工具,优先使用它。

3.4 第三步:验证与刷新

完成上述步骤后,关闭注册表编辑器。你需要让系统刷新一下对文件关联的缓存。

  1. 可以尝试重启“Windows资源管理器”。按Ctrl + Shift + Esc打开任务管理器,找到“Windows资源管理器”,右键“重新启动”。
  2. 或者,更彻底的方法是注销当前用户并重新登录,或者直接重启电脑。
  3. 重启后,找一个.uproject文件右键点击,看看菜单是否回来了。

4. 一键修复脚本:高效安全的解决方案

手动修改虽然能学原理,但步骤繁琐且容易出错。为此,我编写了一个通用的注册表修复脚本(.reg文件)。你可以根据自己引擎的安装路径进行微调后使用。

4.1 脚本内容与解析

将以下代码保存为一个文本文件,并将其后缀名改为.reg,例如Fix_UE4_ContextMenu.reg

Windows Registry Editor Version 5.00 ; 修复 UE4 .uproject 文件右键菜单关联脚本 ; 请根据你的虚幻引擎实际安装路径修改下面两处 "C:\\Program Files\\Epic Games\\UE_4.27" ; 例如,如果你安装的是UE5.0,路径可能是 "C:\\Program Files\\Epic Games\\UE_5.0" ; 1. 关联 .uproject 扩展名到 UnrealProject 类 [HKEY_CLASSES_ROOT\.uproject] @="UnrealProject.1" ; 2. 定义 UnrealProject.1 类的详细信息 [HKEY_CLASSES_ROOT\UnrealProject.1] @="Unreal Engine Project File" "FriendlyTypeName"="Unreal Engine Project File" ; 2.1 设置文件图标(指向UnrealVersionSelector.exe中的图标) [HKEY_CLASSES_ROOT\UnrealProject.1\DefaultIcon] @="C:\\Program Files\\Epic Games\\UE_4.27\\Engine\\Binaries\\Win64\\UnrealVersionSelector.exe,0" ; 2.2 定义右键菜单 (shell) [HKEY_CLASSES_ROOT\UnrealProject.1\shell] ; 2.2.1 “生成Visual Studio项目文件”菜单项 [HKEY_CLASSES_ROOT\UnrealProject.1\shell\GenerateProjectFiles] @="Generate Visual Studio project files" "Icon"="C:\\Program Files\\Epic Games\\UE_4.27\\Engine\\Binaries\\Win64\\UnrealVersionSelector.exe" [HKEY_CLASSES_ROOT\UnrealProject.1\shell\GenerateProjectFiles\command] @="\"C:\\Program Files\\Epic Games\\UE_4.27\\Engine\\Binaries\\Win64\\UnrealVersionSelector.exe\" /projectfiles \"%1\"" ; 2.2.2 “切换虚幻引擎版本...”菜单项 [HKEY_CLASSES_ROOT\UnrealProject.1\shell\SwitchVersion] @="Switch Unreal Engine version..." "Icon"="C:\\Program Files\\Epic Games\\UE_4.27\\Engine\\Binaries\\Win64\\UnrealVersionSelector.exe" [HKEY_CLASSES_ROOT\UnrealProject.1\shell\SwitchVersion\command] @="\"C:\\Program Files\\Epic Games\\UE_4.27\\Engine\\Binaries\\Win64\\UnrealVersionSelector.exe\" /switchversion \"%1\"" ; 2.2.3 “用虚幻编辑器打开”菜单项(作为默认操作) [HKEY_CLASSES_ROOT\UnrealProject.1\shell\open] @="Open with Unreal Editor" [HKEY_CLASSES_ROOT\UnrealProject.1\shell\open\command] @="\"C:\\Program Files\\Epic Games\\UE_4.27\\Engine\\Binaries\\Win64\\UnrealVersionSelector.exe\" /editor \"%1\""

脚本关键点解析:

  • Windows Registry Editor Version 5.00:这是注册表文件的标准开头。
  • 分号;后面的内容是注释,不会被执行,用于说明。
  • [HKEY_CLASSES_ROOT\...]:表示要操作或创建的注册表项路径。
  • @=:表示修改或创建该项下的“(默认)”值。
  • 路径中的双反斜杠\\:在.reg文件里,路径分隔符反斜杠\需要转义,写成\\
  • 带空格的路径和参数需要用引号"括起来。整个命令字符串被引号包围,内部的路径也用引号,所以看到\"...\"的格式。
  • %1:代表传递给命令的文件路径参数。

4.2 脚本的使用与定制方法

  1. 修改路径:用记事本打开这个.reg文件。找到所有C:\\Program Files\\Epic Games\\UE_4.27的实例。将其替换为你电脑上虚幻引擎的实际安装路径。例如,如果你用的是UE 4.26,就改为C:\\Program Files\\Epic Games\\UE_4.26;如果是UE5,则改为C:\\Program Files\\Epic Games\\UE_5.0等。务必修改所有出现的地方
  2. 保存修改:保存文件。
  3. 关闭安全中心实时保护:如前所述,暂时关闭Windows安全中心的实时保护,防止它阻止脚本导入。
  4. 运行脚本:双击这个.reg文件。系统会弹出管理员权限警告和添加注册表提示,点击“是”和“确定”。
  5. 刷新系统:同样,重启资源管理器或电脑使更改生效。
  6. 重新启用安全中心:操作完成后,切记重新打开Windows安全中心的实时保护。

重要警告:双击运行.reg文件会直接合并到注册表,覆盖现有项。如果你之前有过复杂的自定义配置,可能会被覆盖。因此,运行前备份注册表(第一步)至关重要。如果你不确定,可以先在虚拟机或测试机上尝试。

4.3 脚本的扩展与适配

这个脚本是一个基础模板。你可以根据需要进行扩展:

  • 多引擎版本:如果你安装了多个版本的UE4/UE5,上述脚本只会关联到你指定的那个版本路径。通常,最新安装的引擎版本会通过UnrealVersionSelector.exe自动管理版本切换,所以一般关联到最新的或你最常用的版本路径即可。
  • 添加更多菜单项:如果你想添加其他自定义工具到右键菜单(比如用特定工具进行资源检查),可以模仿shell\GenerateProjectFiles的结构,创建新的子项和command,并在command的默认值里填写你的工具命令。
  • 修复其他文件类型:同样的原理可以应用于修复其他软件(如Unity的.unity文件、特定IDE的项目文件等)的右键菜单关联。关键在于找到正确的文件扩展名、类标识符以及对应的命令行。

5. 高级排查与防御策略

即使修复了,我们也不希望问题反复发生。以下是一些进阶的排查思路和预防措施。

5.1 问题未解决的排查方向

如果运行脚本后问题依旧,可以按以下顺序排查:

  1. 权限问题:以管理员身份运行注册表编辑器,直接导航到HKEY_CLASSES_ROOT\.uprojectHKEY_CLASSES_ROOT\UnrealProject.1,右键选择“权限”,确保你的用户或“Everyone”或“Users”组至少有“读取”和“特殊权限”(遍历文件夹/执行文件)的权限。有时安全中心删除后,会留下权限限制。
  2. 用户注册表覆盖:除了HKEY_CLASSES_ROOT(HKCR),文件关联也可能受当前用户配置影响。检查HKEY_CURRENT_USER\Software\Classes\.uproject。如果存在,它可能会覆盖HKCR中的全局设置。可以尝试备份后删除此项。
  3. 第三方软件冲突:某些安全软件(如360、电脑管家等)或系统优化工具可能比Windows安全中心更激进。检查它们的日志或隔离区,看是否将相关注册表项列为威胁。尝试暂时退出这些软件后再修复。
  4. UnrealVersionSelector 本身问题:右键菜单命令最终是调用UnrealVersionSelector.exe。确保该文件存在于你指定的路径,并且没有被损坏或误删。可以尝试从Epic Games Launcher中验证或修复引擎文件。
  5. 重建图标缓存:有时菜单回来了但图标不显示,可能是图标缓存问题。可以尝试清理图标缓存:停止“Windows资源管理器”进程,删除%localappdata%\IconCache.db文件,然后重启资源管理器。

5.2 如何防止安全中心再次“误杀”

一味关闭安全中心不是好办法。我们可以尝试将它“调教”得更智能一些。

  1. 添加排除项:进入Windows安全中心 -> “病毒和威胁防护” -> “病毒和威胁防护设置” -> “管理设置” -> 下拉找到“排除项”,点击“添加或删除排除项”。
    • 你可以尝试添加一个文件夹排除项:将你的虚幻引擎安装目录(如C:\Program Files\Epic Games)添加进去。但这可能范围过大。
    • 更精准的是添加一个进程排除项:添加UnrealVersionSelector.exe。这样安全中心就不会监控和干扰这个关键进程的行为。
    • (高级)添加注册表排除项:某些安全中心版本允许排除特定的注册表路径。你可以尝试添加HKEY_CLASSES_ROOT\.uprojectHKEY_CLASSES_ROOT\UnrealProject.1。但这个选项不一定在所有Windows版本中都可见。
  2. 使用组策略(仅限Windows专业版/企业版):运行gpedit.msc,导航到“计算机配置” -> “管理模板” -> “Windows组件” -> “Microsoft Defender防病毒” -> “实时保护”。找到“关闭实时保护”并启用它?不,绝对不建议完全关闭。更好的方法是寻找“定义实时保护排除的路径”或“定义进程排除项”等策略进行设置。
  3. 保持系统和引擎更新:Epic Games和微软可能会在后续更新中修复一些已知的兼容性问题。确保你的Windows 10和虚幻引擎都是最新版本。

5.3 注册表修复的替代方案

如果修改注册表让你感到不安,或者问题非常顽固,可以考虑以下替代方案:

  1. 重新安装Unreal Engine:通过Epic Games Launcher,对出问题的引擎版本执行“验证”或“修复”。这通常会让安装程序重新写入正确的注册表项。如果不行,可以尝试卸载后重装(注意备份项目)。
  2. 使用第三方文件关联管理工具:有一些像“FileTypesMan”或“Default Programs Editor”这样的免费工具,提供了比系统界面更强大的文件关联管理功能,可以直观地查看和修复关联,有时比直接操作注册表更安全方便。
  3. 创建批处理文件作为快捷方式:如果只是需要“生成项目文件”这个功能,你可以自己创建一个批处理文件(.bat),内容就是之前提到的命令,然后把它放在方便的位置。需要时,将.uproject文件拖到这个批处理文件上即可执行。这绕过了右键菜单,但实现了核心功能。

6. 常见问题与解决方案速查表

为了方便快速定位和解决问题,我将常见现象、可能原因和解决方案整理成下表:

问题现象可能原因解决方案
.uproject右键菜单完全空白,只有通用选项。1. 注册表关联项被安全软件删除。
2. 注册表权限错误。
1. 使用本文提供的注册表脚本修复。
2. 检查并修复HKEY_CLASSES_ROOT\.uproject及相关项的权限。
双击.uproject文件,弹出“选择打开方式”对话框。文件类型关联(HKEY_CLASSES_ROOT\.uproject的默认值)丢失或错误。手动或通过脚本,确保.uproject项的默认值指向正确的类名(如UnrealProject.1)。
右键菜单有UE4选项,但点击后无反应或报错。shell\...\command中的命令路径或参数错误。检查注册表中对应command的默认值,确保路径正确,特别是引擎版本号。优先使用UnrealVersionSelector.exe的命令格式。
修复后,菜单出现但图标显示为白板。图标缓存未更新或DefaultIcon路径错误。1. 清理图标缓存(删除IconCache.db)。
2. 检查注册表中DefaultIcon项的路径。
只有当前用户有问题,其他用户正常。配置保存在HKEY_CURRENT_USER\Software\Classes下,且已损坏。检查并修复HKEY_CURRENT_USER\Software\Classes\.uproject下的项,或直接删除该项以使用全局(HKCR)设置。
运行修复脚本时被系统/安全软件阻止。用户账户控制(UAC)或安全软件拦截。1. 确保以管理员身份运行。
2. 临时关闭安全中心实时保护。
3. 将脚本文件添加到安全软件白名单。
问题在每次系统扫描或更新后复发。Windows安全中心或第三方杀软持续将相关注册表项视为威胁。1. 将UnrealVersionSelector.exe或引擎目录添加到安全中心的排除列表。
2. 考虑更换或调整第三方安全软件的监控规则。

我个人在实际操作中的体会是,这个问题虽然烦人,但根源清晰,解决路径明确。最一劳永逸的方法,不是每次出问题都去修复,而是“教育”好你的安全软件。将UnrealVersionSelector.exe添加到Windows安全中心的进程排除项,在我经历的多台开发机和同事的电脑上,几乎完全杜绝了此问题的复发。这就像给一位过于尽责的保安一份白名单,告诉他“这位是自家程序员,他动注册表是在干活,别拦着”。这个小小的设置,能为你的开发流程省去无数不必要的打扰。最后,无论采用哪种修复方式,养成定期备份重要项目(以及偶尔导出关键注册表项)的习惯,永远是数字世界里最稳妥的“安全带”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/3 16:59:51

3分钟搞定网易云音乐NCM解密:从加密文件到通用MP3的完整指南

3分钟搞定网易云音乐NCM解密:从加密文件到通用MP3的完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM加密文件无法在车载音响、手机自带播放器或其他设备上播放而烦恼吗?ncm…

作者头像 李华
网站建设 2026/8/3 16:58:43

DRV8301/8303电机驱动代码实战:从SPI配置到电流采样校准

1. 项目概述:从芯片手册到电机转起来做电机驱动,尤其是无刷直流(BLDC)或者永磁同步电机(PMSM)的驱动,硬件设计只是第一步,真正让电机按照你的想法精准、高效、稳定地转起来&#xff…

作者头像 李华
网站建设 2026/8/3 16:51:39

ASP.NET注册页面与SQL Server整合开发实践

1. 项目概述:ASP.NET注册页面与SQL Server的深度整合在Web应用开发中,用户注册功能是最基础却至关重要的模块。最近我在一个电商项目中完整实现了基于ASP.NET的注册系统,并与SQL Server数据库进行了深度交互。这个看似简单的功能背后&#xf…

作者头像 李华