众所周知,vnr的翻译窗口和左侧菜单是可以伴随游戏移动的,想在C#中实现,查找了一下正好有,这是利用SetWinEventHook实现的https://stackoverflow.com/questions/48767318/move-window-when-external-applications-window-moves,极少数游戏可能不适用,C#的Process类不一定是我们想要的主窗口

这是通过SetWinEventHook实现,当目标窗口位置或者大小改变后,利用GetWindowRect函数获取目标窗口坐标,从而更新翻译窗口坐标。

在wpf中,可以绑定Top和Left属性,设定两个坐标偏移量作为两个窗口之间的桥梁。如果翻译窗口自身位置发生变化,可以通过一些窗口事件,比如MouseLeave事件更新偏移量。根据偏移量更新窗口Top和Left属性就行了。不过注意一下某些游戏全屏,翻译窗口可能会跑到屏幕之外。不过很多游戏全屏状态无法显示翻译窗口,或许采用类似D3DHook的东西能较好实现。

窗口用到的东西:

日文分词 MeCab.DotNethttps://github.com/kekyo/MeCab.DotNet

分词词典 mecab-ipadic-neologd https://github.com/neologd/mecab-ipadic-neologd ,词汇量比默认的mecab-ipadic多得多,缺点是很大,800多m左右。

或者 unidic https://unidic.ninjal.ac.jp/download

窗口模糊 FluentWPF 此方法仅限win10):https://github.com/sourcechord/FluentWPF/blob/e1d8176e8d81c6b1b7e6fe65a2c19cf27a4fe270/FluentWPF/Utility/AcrylicHelper.cs

窗口样式则是仿Yuki 做了一下 :(Copy了一下文字颜色)https://github.com/project-yuki/YUKI


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。