利用钩子函数动态汉化外文程序菜单

Unity游戏实时汉化实战:基于XUnity.AutoTranslator与BepInEx的通用解决方案 实时汉化技术通过拦截游戏渲染流程中的文本,并调用翻译引擎进行即时替换,为玩家提供了无需等待官方或汉化组即可体验外语游戏内容的能力。其核心原理在于利用函数钩子技术,在游戏绘制文本时动态替换内存数据,从而实现“所见即所得”的本地化效果。这项技术的价值在于其通用性与即时性,尤其适用于Unity引擎开发的独立游戏或小众作品,能极大拓展玩家的游戏选择范围。在实际应用场景中,玩家常借助BepInEx这一Unity Mod框架来加载汉化插件,并通过配置在线或离线翻译后端(如Google Translate、Baidu T 阅读详情

利用钩子函数动态汉化外文程序菜单

 杨山河

 

引言
当前,英文版的应用程序,一般在中文平台上就相应有中文版。这其中有软件商自己推出的中文语言本地化版本,也有国内或国外的第三方供应商为了市场需要而推出中文版本。后者汉化的方式又分内核汉化和外挂汉化。由于内核汉化涉及到版权等一系列问题,加之源代码设计不一定与中文兼容,因而很少有人采用。因此,在今天的中国,从中文之星到四通立方均采用外挂汉化的方式。而外挂汉化又可以采用多种途径,并且根据所处的操作系统平台的语种不同(简体中文、繁体中文、英文等),汉化的程度也不同。笔者对其中的技术略有了解,通过研究,在此提出一种在中文操作系统平台上外挂汉化的方法,供感兴趣的同仁讨论。

在此之前,我们必须明确几个相关概念。

 

二.Windows的“钩子”

同PC上的老资格操作系统DOS编程不同,Windows下编程必须得遵守微软给大家规定的“游戏规则” :建立一个窗口,为该窗口建立一个消息循环,在窗口函数中分段完成各种工 作,总之:必须听从微软的安排,否则,你的应用程序就是不符合规范的 ,难以保证兼容性。其实,微软留下很多“后门”,“钩子函数”就是其中手段之一。

所谓“钩子函数”,即是的消息处理机制中留给应用程序的一个手段,应用程序可以利用它安装一个针对特定的消息的子例程,使得我们可以在某些消息在到达目的地之前监视或修改它们。Windows提供了7种钩子函数, Windows 95有13种。鉴于操作系统的发展趋势,不作Windows3.x的讨论,以下提到Windows时指Windows 95(简称Win95)。安装和卸下这些钩子函数的方法是相同的,Win95使用以下API:

HHOOK SetWindowsHookEx(//安装

int idHook, //要安装的钩子的类型

HOOKPROC lpfn,// 钩子函数地址(回调函数)

HINSTANCE hMod,// 钩子函数所在程序的实例句柄

DWORD dwThreadId//要为之安装钩子的线程的ID

);

 

当一些应用程序安装同一类的钩子时,就会形成一个钩子函数链。安装函数返回指定钩子类型所安装的过滤函数实例句柄。。

BOOL UnhookWindowsHookEx(//卸下

HHOOK hhk //将要被卸下的钩子函数的句柄

);

Win95下的钩子类型有:

WH_CALLWNDPROC //窗口过程钩子

WH_CALLWNDPROCRET //消息已在窗口过程处理

//后,接收这些消息的钩子函数

WH_CBT //基于计算机的训练钩子

WH_DEBUG //查错钩子

WH_FOREGROUNDIDLE //前台空闲窗口钩子

WH_GETMESSAGE //接收投递消息的钩子

WH_JOURNALPLAYBACK //回放以前输入消息钩子

WH_JOURNALRECORD //记录输入消息钩子

WH_KEYBOARD //键盘钩子

WH_MOUSE //鼠标器钩子

WH_MSGFILTER //对话框等的消息钩子

WH_SYSMSGFILTER //系统消息钩子

WH_SHELL //外壳钩子

通常将钩子函数放在DLL中,使得它可供系统内的每一个进程访问,因此安装钩子API中的第三个参数应该是DLL模块的句柄。

在这些类型的钩子中,WH_GETMESSAGE类型的钩子可以为我们存取窗口的信息服务。该钩子截获所有通过标准的消息循环获取函数GetMessage从应用队列获取的消息。这些消息当中包含着很多有价值的数据,譬如:窗口句柄等。

一般情况下,钩子函数无论所关联的进程是否活动,均会被调用,会降低系统的性能,甚至破坏系统稳定。因此,钩子函数的使用应该慎重,并且使用完毕,应立即卸下。Win95是一个多线程的系统,需要使用者注意所用的钩子函数的作用范围。以下是作用范围的说明:

钩子 作用范围

WH_CALLWNDPROC 线程或系统

WH_CBT 线程或系统

WH_DEBUG 线程或系统

WH_GETMESSAGE 线程或系统

WH_JOURNALPLAYBACK 仅系统

WH_JOURNALRECORD 仅系统

WH_KEYBOARD 线程或系统

WH_MOUSE 线程或系统

WH_MSGFILTER 线程或系统

WH_SHELL 线程或系统

WH_SYSMSGFILTER 仅系统

 

 

利用钩子函数实现汉化
如果我们知道一个窗口的句柄,我们就可以GetMenu函数获得

该窗口的菜单句柄。之后,我们可以通过以下菜单函数进行每一菜单项的外文字符串获取,通过查字典可以获取相应的中文字符串,最后将中文字符串对外文字符串进行替换。注意,中文的显示本程序并不能解决,所以需要在中文操作系统上执行。这里的以上过程可以表示为:

 

hWnd(窗口句柄)

 

GetMenu( hWnd)

 

hMenu(菜单句柄)

GetSubMenu(hMenu,flag,position)

 

hSubMenu(子菜单句柄)

GetMenuItemString(hSubMenu,position,lpString,len,flag)

lpszText(菜单项外文字符串)

 

FindChinese(lpString,lpChinese,len)

 

lpszChinese(中文字符串)

 

ModifyMenu(hSubMenu,position,flag,id,lpChinese)

菜单项汉化

 

那么,如何从一个程序获取另外一个程序的窗口句柄呢?这必须知道窗口的窗口类。因为窗口类名是一个全局原子,不可能和另外的类名相同,可以作为唯一标识 。通过类名,FindWindowEx可以获取它的当前正在运行的应用程序实例的窗口句柄。

通过以上分析,我们可以提出这样一个方案:

运行一个特定的应用程序,该程序完成两项任务:

 
搜索我们的外文版程序的类名,获取该程序当前实例的窗口句柄、主线程的ID,为其安装一个WH_GETMESSAGE类型的钩子函数。利用窗口句柄获取主菜单句柄,在菜单后面加上一个自定义的菜单项。该菜单项主要用来向窗口过程发送消息,以便WH_GETMESSAGE类型的钩子函数能够激活,并且获得外文

程序的主菜单的句柄,进行上述分析的汉化过程。

2.

钩子函数主要进行汉化工作。钩子函数应该存在与一个DLL中。主要用来截获自定义的菜单消息,在此菜单消息处理中,获取主菜单句柄,查找DLL中的字典,替换外文菜单项。

 

程序说明
由于Win95是多线程环境,因而给程序挂接钩子函数时必须指定线程ID。在Windows 3.x环境下,该参数通常置为 NULL。
钩子安装程序在寻找窗口类时,若找不到,应该根据设定的有关外文程序的路径,利用Winexec函数启动之,再来寻找,以便可以顺利安装钩子函数。
钩子安装程序通过获得窗口句柄,此时也可以进行菜单汉化。但考虑到许多应用程序在运行当中往往动态修改菜单,因而将汉化的主要过程放在钩子函数中。因为在卸下前钩子总有效,所以通过自定义菜单项的选取,就可以方便的进行动态汉化。
钩子安装程序和我们要汉化的外文程序是两个不同的进程,在Win95下分别享有两个不同的应用程序空间。要实现动态连接库的字典为外文程序所用,因为钩子函数挂接后,同所关联的线程属同一进程空间,而DLL中的字典数据属于钩子安装程序,所以必须将字典和一些钩子函数用到的变量设置成存储器共享,需用到#pragma date_seg指令。具体见程序代码。这一点很重要,否则会出现令人讨厌的保护错。
为简单起见,动态连接库中的字典词条数量有限。实际上,Win95下,可以大于64K。另,示例中采用的模式匹配极为简单,大家可以在次基础上进行改进。
菜单中往往包含有许多的键盘操作简捷键,所以中文字符串必须要继承外文字符串中的相关内容,原程序的所有操作必须不能被改变。。
替换菜单项后,必须马上进行菜单条的刷新,否则会使菜单的显示极为混乱。具体应在替换后立即调用DrawMenuBar函数。
要定义好.def文件,对函数的导出、引入必须准确,否则会导致编译失败。
程序在Pwin95、BC5.0,PMMX166环境下通过。可能需要BC的一些动态连接公用库,调试时注意。
10为起到演示目的、缩减篇幅,在此将程序的部分代码进行注释。

钩子函数安装程序:

#define STRICT

#include <windows.h>

#include <windowsx.h>

#include "mate.h"

BOOL WINAPI _import InstallMsgFilterHook(HWND hWnd);

int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPre, LPSTR lpCmdLine, int nCmdShow)

{

char szProgramClass[30]="shi";//外文程序的类名,此处为本演示//程序的类名

char szProgramPath[30]="e://ysh//shi//shi.exe";//外文程序路径,此

//处可以设置成读者自定义的要被汉化的程序路径

MSG msg;

HWND _hWnd; //要被挂接钩子的外文程序句柄

HMENU hMenu; //主菜单句柄

int nTopLevel; //顶级弹出菜单的项数

_hWnd=FindWindow( szProgramClass,NULL);

if(_hWnd= =NULL) //未找到

{

if(WinExec(szProgramPath,SW_SHOW)==ERROR_FILE_NOT_FOUND) //未找到指定的程序

{

MessageBox(NULL,"File not found!","中文伴侣",MB_OK);

return(FALSE);

}

_hWnd=FindWindow(szProgramClass,NULL);//启动之后再次寻找

if(_hWnd==NULL)

{

MessageBox(NULL,"Find Window Faild!","中文伴侣",MB_OK);

return(FALSE);

}

}

LoadLibrary("mate.dll"); //装入库

hMenu=GetMenu(_hWnd); //获取菜单

AppendMenu(hMenu,MF_BITMAP|MF_ENABLED,CM_MYMENUITEM,"中文&&英文"); //增加自己的菜单项

 

DrawMenuBar(_hWnd); //重画菜单条,否则菜单显示混乱

if(!InstallMsgFilterHook(_hWnd))//安装钩子

{

MessageBox(NULL,"钩子函数安装失败!","中文伴侣",MB_OK);

return(FALSE);

}

}

return(TRUE);

}

 

动态连接库的主要代码:

#define COMMONNUM 100

#include <windows.h>

#include <windowsx.h>

#include <string.h>

#include "mate.h"

#pragma data_seg("Tweny") / /须在.def中说明成共享段

static HHOOK MsgFilterHook=NULL;//接收投递消息钩子句柄

static HINSTANCE hInstance=NULL;

static HWND shihWnd=NULL; //外文程序窗口句柄

static BOOL flag=TRUE;

static HMENU hWndMenu=NULL; //菜单句柄

COMMONDICT word[COMMONNUM]= //字典,结构定义在头

//文件中

{

{"&File", "文件&F"},

{"&New", "新建&N"},

{"&Open", "打开&O"},

{"&Save", "保存&S"},

{"Save &As", "另存为&A"},

{"P&rinter Setup", "打印机设置&R"},

{"Page Set&up", "页面设置&U"},

{"&Print", "打印&P"},

{"E&xit", "退出&X"},

{"&Edit", "编辑&E"},

{"&Undo", "撤消&U"},

{"&Redo", "重做&R"},

{"Cu&t", "剪切&T"},

{"&Copy", "复制&C"},

{"&Paste", "粘贴&P"},

{"&Window", "窗口&W"},

{"&Windows", "窗口&W"},

{"&Tile", "级联&T"},

{"&Cascade", "层叠&C"},

{"&Hide", "隐藏&H"},

{"&Hidden", "隐藏&H"},

{"&View", "展示&V"},

{"&All", "所有的&A"},

{"&Hidden Document List", "隐藏所有的文本窗口&H"},

{“&Help","帮助&H"},

{"Help Topics","帮助主题&W"},

{"&What's This?","这是什么&W"},

{"&About", "关于&A"},

};

#pragma data_seg( ) //共享段声明结束

 

BOOL WINAPI _export InstallMsgFilterHook(HWND hWnd);

LRESULT CALLBACK _export MsgFilter(int nCode ,WPARAM wParam,LPARAM lParam); //钩子类型声明

BOOL WINAPI searchDict1(char * english,char * chinese);//查字典

BOOL WINAPI DllEntryPoint(HINSTANCE hInThis,DWORD fDwReason,LPVOID lpvResvered)

{

hInstance=hInThis;

switch( fDwReason)

{……}//参见相关文档

return (TRUE);

}

BOOL WINAPI _export InstallMsgFilterHook(HWND hWnd)

{//安装钩子函数

DWORD pid;//线程ID

shihWnd=hWnd; //被挂接的程序窗口

hWndMenu=GetMenu(shihWnd);//获取菜单句柄

if(!hWndMenu)MessageBox(NULL,"Get Menu Faild",

"Install",MB_OK);

return(MsgFilterHook=SetWindowsHookEx(WH_GETMESSAGE ,(HOOKPROC)MsgFilter,hInstance ,GetWindowThreadProcessId(hWnd,&pid) )!=NULL);//安装指定线程的钩子函数

}

LRESULT CALLBACK _export MsgFilter(int nCode ,WPARAM wParam,LPARAM lParam)

{//消息过滤函数

HMENU hPopup; //主菜单句柄

char lpMenustr[30];//菜单项的字符串

int i,Count;

if(nCode>=0) //小于零应留给系统处理

{

switch(nCode)

{

MSG * msg;

HMENU hSubMenu,hSub2Menu;//两层菜单

HWND hWndThis;

char buf[100],chinese[100];//字符缓冲区

int topnum,subnum,sub2num;//分别为顶级菜单项数、

//弹出菜单项数、二级子菜单项数

int i=0,j=0,k=0;

UINT ItemID; //菜单项ID,修改菜单项时不可更改菜单的命令ID

MENUITEMINFO MenuItem;

case HC_ACTION :

msg=(MSG *)lParam;

switch (msg->message)

{

case WM_COMMAND:

if(msg->wParam==CM_MYMENUITEM)//是自定义菜单项吗

{

hWndThis=msg->hwnd;//获取的窗口句柄

hWndMenu=GetMenu(hWndThis);//获取主菜单句柄

topnum=GetMenuItemCount(hWndMenu);//获取顶级菜单项数

for(i=0;i<topnum-1;i++)

{

if(GetMenuString(hWndMenu,i,buf,100,MF_BYPOSITION))

//获取指定位置菜单项的字符串

{

if(searchDict1(buf,chinese))//若从字典中查到

{

ItemID=GetMenuItemID(hWndMenu,i);//先获取菜单ID

ModifyMenu(hWndMenu,i,MF_STRING|MF_BYPOSITION,ItemID,chinese);//修改菜单

DrawMenuBar(hWndThis);//立即更新

}

else

{

}

}

}

if (hWndMenu)

{

for(i=0;i<topnum-1;i++)

{//汉化弹出菜单项

hSubMenu=GetSubMenu(hWndMenu,i);

subnum=GetMenuItemCount(hSubMenu);

for(j=0;j<=subnum;j++)

{

{

if(GetMenuString(hSubMenu,j,buf,100,MF_BYPOSITION))

//弹出菜单项内容是字符吗

{

if(searchDict1(buf,chinese))//查字典

{

ItemID=GetMenuItemID(hSubMenu,j);

if(ItemID==0xFFFFFFFF)//还有下层子菜单吗

{//汉化

hSub2Menu=GetSubMenu(hSubMenu,j);

sub2num=GetMenuItemCount(hSub2Menu);

for(k=0;k<sub2num;k++)

{

if(GetMenuString(hSub2Menu,k,buf,100,MF_BYPOSITION))

{

if(searchDict1(buf,chinese))

{

ItemID=GetMenuItemID(hSub2Menu,k);

ModifyMenu(hSub2Menu,k,MF_STRING|MF_BYPOSITION,ItemID,chinese);

}

}

}

}

ModifyMenu(hSubMenu,j,MF_STRING|MF_BYPOSITION,ItemID,chinese);

DrawMenuBar(hWndThis);//立即更新

}

}

}

}

}

}

else

MessageBox(NULL,"hWndMenu is NULL","My hook",MB_OK);

}//未获得主菜单句柄

break;

default:

break;

}

break;

}

}

return( CallNextHookEx(MsgFilterHook,nCode,wParam,lParam));

}

 

BOOL WINAPI searchDict1(char * english,char * chinese)

{

char in[100],out[100];

int i;

BOOL flag;//查找标志

lstrcpy(in,english);

for(i=0;i<60/*NUMBER*/;i++) //此处限定字典的长度

{

lstrcpy(out,word[i].English);

flag=lstrcmp(in,out);

if(!flag)//查到

{

lstrcpy(chinese,word[i].Chinese);//复制中文字符

break;

}

else

{//此处可添加查第二字典的代码

}

}

return(!flag); //返回查找结果

}  

Unity游戏实时汉化实战:XUnity.AutoTranslator与BepInEx插件配置全解析 游戏本地化是将游戏内容适配不同语言和地区的过程,其核心原理在于文本资源的提取、翻译与替换。传统本地化依赖人工翻译和代码修改,成本高昂且周期长。随着机器翻译API和运行时Hook技术的发展,出现了自动化、低侵入的实时翻译方案,为独立游戏和小型团队提供了高效原型测试工具,也为玩家社区带来了自助汉化可能。这类技术通过插件框架拦截游戏文本渲染函数,调用在线翻译服务并缓存结果,实现了近乎实时的语言转换。XUnity.AutoTranslator正是基于这一理念构建的Unity游戏实时翻译插件,它依赖BepInEx框架 阅读详情

相关推荐

Unity游戏自动翻译器原理与实战:XUnity实现多语言动态汉化

在游戏开发与本地化领域,运行时文本拦截与动态翻译技术正成为解决多语言适配难题的关键方案。其核心原理基于Hook技术,通过在游戏进程注入钩子,拦截Unity引擎的文本渲染API调用,实现文本内容的实时替换。这项技术的核心价值在于,它绕过了传统本地化中繁琐的文本资源管理与代码修改流程,为独立开发者和小型团队提供了低成本、高效率的多语言支持方案。在实际应用场景中,结合翻译缓存机制与在线/离线翻译引擎,能够显著降低游戏汉化门槛,尤其适用于快速原型验证、存量游戏本地化以及玩家社区自制汉化补丁等场景。本文以XUnity

weixin_34284188的博客 416

HOOK API入门之Hook自己程序的MessageBoxW

说到HOOK,我看了很多的资料和教程,无奈就是学不会HOOK,不懂是我的理解能力差,还是你们说的 不够明白,直到我看了以下这篇文章,终于学会了HOOK: http://blog.sina.com.cn/s/blog_628821950100xmuc.html    //感谢文章作者的分享,让我学会了HOOK ----------------------------------------

friendan的专栏 5万+

5分钟为Unity游戏实现实时汉化:XUnity AutoTranslator与BepInEx实战指南

游戏本地化是将游戏内容适配到不同语言和文化区域的过程,其核心原理在于对游戏文本资源的提取、翻译与替换。传统汉化技术往往需要反编译、修改游戏文件,流程复杂且存在风险。而运行时动态文本替换技术,通过注入式插件在游戏进程内存中实时拦截并替换文本,实现了对游戏零修改的本地化方案,极大降低了技术门槛。这种技术的工程价值在于其非侵入性和即时性,玩家无需等待官方或社区汉化补丁,即可快速体验外语游戏。其典型应用场景包括独立游戏、小众Unity游戏以及暂无官方中文版本的作品。本文聚焦于利用XUnity AutoTransla

weixin_30368981的博客 361

游戏实时汉化工具:一键拖拽支持40+引擎,畅玩全球神作

工具内置**在线翻译API**(谷歌、百度、有道、DeepL)和**离线OCR引擎**(Tesseract、Windows OCR)。启动游戏后,所有文本(包括UI、对话、提示框)会被实时替换为中文。- **不适合竞技游戏**:实时翻译会引入约100-500ms的延迟(取决于翻译引擎和OCR速度),不适合《APEX英雄》《CS2》等对响应要求高的游戏。- **OCR模式**:若游戏不支持截取(如DirectX 11/12),在工具中切换到“OCR模式”,并选择“Windows OCR”(速度最快)。

2509_94200320的博客 8509

Unity游戏实时汉化神器:XUnity.AutoTranslator从原理到实战全解析

在游戏本地化与软件国际化领域,运行时文本替换技术是实现多语言支持的核心方案之一。其原理是通过插件框架注入进程,拦截并钩取(Hook)应用程序的文本渲染函数调用,在文本显示前进行实时处理。这项技术的核心价值在于无需修改原始程序资源,即可实现动态语言切换,极大提升了适配效率与灵活性。在实践层面,它广泛应用于独立游戏、小众软件的即时翻译场景,尤其适合解决官方未提供本地化支持的痛点。本文聚焦的XUnity.AutoTranslator,正是基于BepInEx插件框架构建的Unity游戏实时翻译解决方案。它通过配置在

weixin_34006468的博客 481

Unity游戏实时翻译插件XUnity.AutoTranslator:从原理到实战应用

在游戏本地化领域,实时文本翻译技术正成为打破语言壁垒的关键。其核心原理在于通过运行时钩子(Hooking)技术,动态拦截游戏引擎的文本渲染调用,获取原始字符串后,经由多级缓存与在线翻译服务处理,再将结果无缝替换回游戏界面。这项技术的核心价值在于实现了非侵入式的实时本地化,无需修改游戏原始文件,极大提升了兼容性与更新鲁棒性。其典型应用场景是为缺乏官方中文的独立游戏、视觉小说等Unity作品提供即时翻译解决方案。本文以XUnity.AutoTranslator(XUA)这一代表性插件为例,深入剖析其通过内存注入

weixin_30292843的博客 311

使用MisakaPatcher制作Galgame外挂汉化补丁

简介 这两天我看见一个galgame机翻工具 MisakaTranslator,它类似VNR,使用C#编写并且支持Hook和OCR(图像识别)两种方法提取文本。 我在MisakaTranslator的基础上进行了一些改动,去除了所有的机翻的功能,转而支持了加载本地汉化补丁的功能,并把它重命名为MisakaPatcher。通过这个工具,即使我们在解包封包上遇到困难,理论上我们还是可以用外挂的方法(手工)汉化任意一款文字游戏。 本项目Github主页 主要功能 Hook + OCR提取文本 智能模糊匹配。匹配

jsc723的专栏 1万+

XUnity.AutoTranslator:Unity游戏实时翻译插件原理与实战指南

在游戏本地化与跨语言体验领域,实时文本翻译技术正成为解决语言障碍的关键方案。其核心原理基于运行时钩子(Hooking)与文本拦截机制,通过注入游戏进程动态捕获并替换显示文本。这项技术的价值在于无需修改游戏本体即可实现即时翻译,极大降低了玩家体验外文游戏的门槛。应用场景广泛覆盖独立游戏、视觉小说及各类Unity引擎开发的软件界面。本文聚焦的XUnity.AutoTranslator,正是基于BepInEx框架实现这一流程的典型工具,它通过配置翻译引擎与缓存策略,让外文游戏实现“秒变中文”成为可能,显著提升了游

weixin_30430677的博客 311

游戏汉化技术内幕 第2章解包封包

作者: 坑神姐姐 AD http://kdays.cn/第1章 KRKR游戏系统汉化说明封包(Pack) —— 相对的就是解包(Unpack)实际上能解包的 不代表就能封包因为解包仅仅代表是从文件中提取出数据 但不代表能更改数据最典型极端的例子就是MTS的gift。里面用TBL对所有文字进行了过滤,当然,现在有办法解决了而且解包不一定要拆解结构 只要读取到文件头和文件结尾处

大师的资源 1万+

Unity游戏实时翻译本地化实战:基于XUnity Auto Translator的五步指南

游戏本地化是打破语言壁垒、连接全球玩家的关键技术,其核心在于将游戏内容适配为目标语言和文化。从技术原理上看,现代游戏本地化通常涉及对游戏运行时文本资源的拦截与替换。在Unity引擎生态中,通过插件框架进行无侵入式的运行时Hook成为一种高效稳定的实现方案,这不仅能避免直接修改游戏代码带来的风险,也为模组开发提供了标准化支持。其技术价值在于让独立开发者或玩家社区能够在不依赖官方支持的情况下,快速实现高质量的多语言适配,极大地拓展了游戏的受众范围与生命周期。典型的应用场景包括为缺乏官方中文的独立游戏注入社区汉化

weixin_33835461的博客 252

利用钩子函数轻松实现应用程序的汉化C++源代码程序小实例

利用钩子函数轻松实现应用程序的汉化C++源代码程序小实例

钩子函数动态汉化外文程序菜单(学习收录)

感谢:http://blog.youkuaiyun.com/iiprogram/archive/2005/02/02/277999.aspx 利用钩子函数动态汉化外文程序菜单 杨山河   引言 当前,英文版的应用程序,一般在中文平台上就相应有中文版。这其中有软件商自己推出的中文语言本地化版本,也有国内或国外的第三方供应商为了市场需要而推出中文版本。后者汉化的方式又分内核汉化和外挂汉化。由...

dongbang3606的博客 224

HOOK实现软件皮肤的DEMO

使用HOOK技术进行软件换肤的一个demo。想研究软件皮肤技术的同仁可以看看。

Unity游戏实时汉化实战:XUnity Auto Translator从入门到精通

游戏本地化是连接全球玩家与开发者的关键技术,其核心在于实现文本与资源的跨语言转换。传统硬编码汉化方案存在维护困难、兼容性差等痛点,而基于运行时拦截的插件化方案则提供了更优解。XUnity Auto Translator(XUAT)正是这一领域的代表性工具,它利用钩子(Hooking)技术,在游戏运行时动态拦截并替换文本,实现了无侵入式的实时翻译。其技术价值在于平衡了易用性、兼容性与可扩展性,支持对接谷歌、百度、DeepL等多种翻译API,并能处理Unity原生UI、TextMeshPro乃至纹理资源。在应用

weixin_34183910的博客 585

钩子函数实现应用程序的汉化

源程序中没有Debug目录,如要运行需要重新编译 生成MenuToChineseHook.dll、MenuToChinese.exe,并 把DemoToChinese.exet和MenuToChineseHook.dll拷贝 到MenuToChinese.exe所在目录。

5G物理层基础知识

1、关于RB和RE (1) RB(Resource Block,资源块)频率上连续12个子载波,时域上一个slot(时隙,14个ofdm符号) (2) RE(Resource Element,资源单元)频率上一个子载波,及时域上一个ofdm符号 注意:协议规定,5G每个时隙(非扩展CP)的符号数为14个(扩展CP情况下每个时隙有12个符号),而LTE(非扩展CP)每个时隙的符号数为7个。 简单说:一个12X14的方格,大的整个叫一个RB,每一个小块叫一个RE。另外,一个RE可存放一个调制符号(mo.

qq_39074243的博客 2万+

Unity IL2CPP环境下XUnity.AutoTranslator翻译失效的深度解决方案

在游戏开发与本地化领域,动态链接库注入与运行时Hook是常见的代码拦截与修改技术,其原理是通过修改目标进程的内存或函数指针,在程序执行流中插入自定义逻辑。这项技术的核心价值在于能够在不修改原始程序代码的情况下,扩展或改变其行为,广泛应用于性能分析、功能增强、安全测试以及游戏模组开发等场景。当Unity游戏从Mono运行时切换到IL2CPP编译后端时,其底层执行模型从托管中间语言转变为静态编译的原生机器码,导致传统的基于IL代码分析的Hook机制失效。本文聚焦于解决在此环境下流行的XUnity.AutoTra

weixin_30699955的博客 352

MicroCap声学仿真介绍(六)-入耳式耳机仿真

从上图可以看出,后腔开了泄声孔后,振膜的最大位移从4.8um提升到了10um,振膜位移增加了一倍。在实际应用中,一般耳机的前腔和后腔都需要开泄声孔,开孔的大小和调音网布的阻尼需要根据客户的要求以及仿真的结果进行权衡选择。接着在主界面放置电阻、电感、电容,电阻值为Rms,电感值为Mms,电容值为Cms,如下图。假设后腔泄声孔的直径为1.2mm,宽度为0.3mm,对应调音网的阻抗为5.5e8欧姆。假设前腔泄声孔的直径为1.2mm,宽度为0.3mm,对应调音网的阻抗为5.5e8欧姆。

山无忧的博客 1800
上一篇: 当职业成为一种负担
下一篇: VC6.0编译器参数设置
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值