泰OFFICE有个BUG,说在UOS+KIRIN系统上,截屏卡死。在KYLIN和其他UOS上,则正常。这么怪异的问题,当然很难解决。只能由吾出场,从JDK角度来看看。
使用的是Robot进行屏幕。于是吾进行跟踪,出错顺序依次是:
- Robot.createScreenCapture()
- XRobotPeer.getRGBPixels
- XRobotPeer.getRGBPixelsImpl()
- awt_Robot.c:getRGBPixelsImpl
这里已经是C了。在这里进行跟踪,发现是compositeGetOverlayWindow导致的。吾仔细想了半天,莫非是窗口产生了没有释放?那找找有没有对应的释放函数。别说,还真找到了一个释放函数:XCompositeGetOverlayWindow。加上之后,果然不死了。
https://www.linuxhowtos.org/manpages/3/XCompositeGetOverlayWindow.htm
不死的问题解决了,拿到的是黑屏,也就是没有得到数据。于是又进行了跟踪。
- awt_Robot.c:getWindowImage
- multiVis.c:ReadAreaToImage
通过对比正确顺序,发现:正确的时候XGetImage()返回结果,错误的时候为NULL。
于是进行了修改:如果有数据设置一个标志;返回时根据标志来决定返回对象还是NULL。
为什么没有数据呢?这个没有进一步分析。
实际上这个系统也能截屏。不知道是系统版本问题(比如UI不一样)?还是显卡适配问题?
标签:UOS,XCompositeGetOverlayWindow,Robot,KIRIN,getRGBPixelsImpl,截屏,NULL From: https://blog.51cto.com/u_13161667/5846769