PeaZomboss

Results 6 comments of PeaZomboss

本人测试发现对于部分较大的文件(至少我测的大于60KB),3.13.1及开发版本存在此问题,3.13.0没有。 虽然我没看过软件源码和git提交记录,但是根据经验判断发现了问题,原因非常奇特。 问题居然出在了文件的**TAB**字符上!!! 原先我是发现一个100多K的文件打开不能预览,删了部分还是不行,然后仔细看发现该文件用了大量TAB符号来排版,然后又写了个小程序把所有TAB符号替换成了4个空格,发现可以了(尽管排版有点乱,因为原文件TAB和空格混搭)。 接着想确定是不是大文件TAB符号的问题,就写了个小程序自动从原文件拷贝一部分生成新文件,发现当这个文件比较小的时候可以预览,文件大了就不行。 所以作者可以查一下是不是哪些改动影响TAB字符的渲染了。 发现问题的文件在此[仓库](https://github.com/FreeBlues/PwML),文件名是 Common Lisp 初学者快速入门指导.md (125KB)

可以复现,估计原因是调用了SetForegroundWindow来弹出窗口的,参考微软的文档 可知存在限制。 网上找到的解决方法是先调用AttachThreadInput然后调用SetForegroundWindow ```c HWND hForeWnd = GetForegroundWindow(); DWORD dwForeID = GetWindowThreadProcessId(hForeWnd, NULL); DWORD dwCurID = GetCurrentThreadId(); AttachThreadInput(dwCurID, dwForeID, TRUE); SetForegroundWindow(hWnd); AttachThreadInput(dwCurID, dwForeID, FALSE); ``` 我在win32程序测试可以。

ThunderBird应该是win32的,因为几年前微软放开了商店的限制。 目前在win11可以发现不论是什么程序都存在在后台的情况下调用SetForegroundWindow不能弹出只会任务栏闪烁。也就是说必须要在前台程序的消息队列调用SetForegroundWindow才能显示其他进程的窗口。

我测试了一下,用detours去hook了浏览器进程的SetForegroundWindow,果然如此。 ```cpp typedef BOOL(WINAPI* REAL_SFW_PROC) (HWND h); REAL_SFW_PROC real_sfw; static BOOL fk_sfw(HWND h) { HWND hForeWnd = GetForegroundWindow(); DWORD dwForeID = GetWindowThreadProcessId(hForeWnd, NULL); DWORD dwCurID = GetCurrentThreadId(); AttachThreadInput(dwCurID, dwForeID, TRUE);...

除了Edge的微型菜单会导致翻译按钮不显示,我发现问题出在了自动隐藏这个选项。 在Edge长按选中单词(或者FireFox双击屏幕),然后拖动两侧的小东西修改选中的文本,这个过程如果时间超过了两秒翻译按钮就自己隐藏了。 合理的逻辑应该是像Edge的微型菜单一样,在拖动小东西时隐藏菜单,在结束后重新显示菜单。 目前关闭自动隐藏可以暂时解决在Edge(没有开启微型菜单)和FireFox的文本选择问题。

不过Edge的微型菜单还是冲突的,开了那个就弹不出翻译按钮了,这个应该是目前剩下的主要问题了。 剩下的就是一些小细节了,比如拖动条的时候按钮的位置变化这种,可以参考微型菜单,不知道能不能集成到微型菜单里面。如果不行的话对于触屏弹出的翻译按钮,可以适当大一点点,这样不容易点歪。