虽然这篇帖子很旧,但我将回复保留在这里,供其他寻找类似解决方案的人使用。
请查看PyWinCtl。如果您能够使用 Python 和 Qt 构建一个无边框、半透明的窗口,则 alwaysOnTop(True) 和 acceptInput(False) 方法将起到作用,但只适用于基于 CGI 调用的游戏,而不适用于使用 DirectDraw 专有模式的游戏(对于此,我也在寻找 Python 解决方案,这就是我为什么来到这里的原因!)
同时,在初始化窗口时,您可以尝试在 Qt 上使用以下代码片段(这是一段代码,不能直接复制,抱歉):
self.setFocusPolicy(QtCore.Qt.NoFocus)
if "Linux" in platform.platform():
self.setAttribute(QtCore.Qt.WA_X11DoNotAcceptFocus, True)
self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents, True)
self.setAttribute(QtCore.Qt.WA_InputMethodTransparent, True)
self.setAttribute(QtCore.Qt.WA_ShowWithoutActivating, True)
self.setWindowOpacity(128)
self.setWindowFlags(QtCore.Qt.Tool| QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowDoesNotAcceptFocus)
我认为函数和参数的名称是自解释的(如果不是,请告诉我)。
使窗口透明以便输入法正常工作是很重要的,否则窗口最终会被点击,游戏就会失去焦点。这个效果对窗口是永久性的。
现有的方法无法实现使窗口半透明。你需要为窗口实现一个自定义的paintEvent,像这样(再次抱歉,无法重现):
def paintEvent(self, event=None):
painter = QtGui.QPainter(self)
painter.setOpacity(0.4)
painter.setBrush(QtCore.Qt.black)
painter.setPen(QtGui.QPenQtCore.Qt.black))
painter.drawRect(self.rect())
让窗口始终保持在顶层的部分可能不是永久的。这就是为什么建议使用 pywinctl 的 alwaysOnTop()方法。此外,最好每隔一秒钟调用该方法,以防止窗口被任何原因遮挡而导致不再在顶层。