project-yuki / YUKI

YUKI Galgame Translator
GNU General Public License v3.0
1.5k stars 144 forks source link

建议:翻译窗口支持全屏游戏模式下的显示 #36

Open PpiLiu opened 4 years ago

PpiLiu commented 4 years ago

由于屏幕分辨率的原因,玩某些不能自由设定窗口大小的游戏时需要使用全屏模式。目前的翻译窗口似乎无法在全屏模式显示,希望能够添加这项功能。

luojunyuan commented 4 years ago

image 点击🔒按钮可以使翻译窗口永远置顶 对于游戏窗口化切换可以试试 alt+enter

PpiLiu commented 4 years ago

image 点击🔒按钮可以使翻译窗口永远置顶 对于游戏窗口化切换可以试试 alt+enter

测试了一下,对于可以使用alt+enter切换全屏的游戏该方法确实有效,但是不能使用alt+enter切换的游戏应该如何应对呢? 我尝试了运行了几个kirikiri2引擎的游戏,发现它们都不支持alt+enter切换窗口化

tinyAdapter commented 4 years ago

搜了一下,全屏程序应该是无解的,因为这种程序直接独占了整个显示器的渲染(这也是为什么全屏游戏相对窗口化有更好的性能)

https://www.quora.com/How-do-I-make-a-window-always-on-top-even-when-fullscreen-game-is-running-by-Qt

A fullscreen 3d application usually demands an exclusive control of the screen. Once it is granted access, every other program takes backseat and won’t be displayed. So, it doesn’t care what window flags are.

如果我没记错的话,好像有一些可以让全屏程序强制窗口化的程序,你可以让试试在那些程序中运行游戏,应该就可以自由拉伸了。

PpiLiu commented 4 years ago

搜了一下,全屏程序应该是无解的,因为这种程序直接独占了整个显示器的渲染(这也是为什么全屏游戏相对窗口化有更好的性能)

https://www.quora.com/How-do-I-make-a-window-always-on-top-even-when-fullscreen-game-is-running-by-Qt

A fullscreen 3d application usually demands an exclusive control of the screen. Once it is granted access, every other program takes backseat and won’t be displayed. So, it doesn’t care what window flags are.

如果我没记错的话,好像有一些可以让全屏程序强制窗口化的程序,你可以让试试在那些程序中运行游戏,应该就可以自由拉伸了。

好的,十分感谢

lxchtan commented 4 years ago

@tinyAdapter 这个应该与electron相关,electron/electron#10078,提到了几种解决方案。 希望作者可以尝试一下解决全屏的问题,这个功能还是挺重要的。

tinyAdapter commented 4 years ago

我又去搜了一下,发现了这个项目:https://github.com/hiitiger/gelectron

能够实现类似Steam Overlay的效果。

不过这已经算是爆改了……估计稳定性会很差😕

lxchtan commented 4 years ago

看起来靠谱? 我粗略看了一下,原理大概是hook与游戏通讯然后把electron的窗口绘制到游戏表面。本来文本提取的时候就是要hook了,再多一个应该可行。 对electron本身只是多了一层窗口传输绘制,影响应该不大。

tinyAdapter commented 4 years ago

那我就先把issue open了,这东西搞起来似乎要改不少代码,我没时间去试,而且感觉这功能确实没那么紧迫……

luojunyuan commented 4 years ago

我发现vnr对于DirectX游戏全屏的处理方法,似乎是调用winapi,获取文字窗口hwnd,忽视文字窗口的焦点以及设置每秒钟调用一次BringWindowToTop(hwnd)