繁体   English   中英

有没有办法让PyQt5中的鼠标事件完全忽略windows?

[英]Is there any way to make mouse events completely ignore windows in PyQt5?

我试过使用setAttribute(Qt.Qt.WA_TransparentForMouseEvents) ,但是鼠标也不能穿透Qtwindow。

我想让鼠标事件 p.netrate Qtwindow,就像我在位于 Windows10 桌面的 Qtwindow 上单击鼠标右键,然后它将触发 win10 上下文菜单。

透明的 window 会满足您的需求吗?

from PyQt5 import QtCore, QtWidgets, QtGui


class Overlay(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()
        self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        layout = QtWidgets.QHBoxLayout(self)
        label = QtWidgets.QLabel('Transparent and propagating')
        label.setFont(QtGui.QFont('Arial', 26))
        label.setStyleSheet("background-color : white")
        layout.addWidget(label)
        self.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    form = Overlay()
    app.exec_()

我试图找出一种直接将点击传输到桌面的方法。 最接近的相关问题给了我一些想法,但最终我无法让它工作,点击永远不会到达桌面。 也许你仍然可以从中得到一些想法:

from PyQt5 import QtWidgets, QtGui
import win32api, win32con
from ctypes import windll


class Overlay(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()
        layout = QtWidgets.QHBoxLayout(self)
        label = QtWidgets.QLabel('Click to Desktop')
        label.setFont(QtGui.QFont('Arial', 26))
        label.setStyleSheet("background-color : white")
        layout.addWidget(label)
        # make window partially transparent to see where you are clicking
        self.setWindowOpacity(0.5)
        # get handle to desktop as described in linked question
        hProgman = windll.User32.FindWindowW("Progman", 0)
        hFolder = windll.User32.FindWindowExW(hProgman, 0, "SHELLDLL_DefView", 0)
        self.desktop = windll.User32.FindWindowExW(hFolder, 0, "SysListView32", 0)
        self.show()

    def mousePressEvent(self, event):
        # catch mouse event to route it to desktop
        x = event.globalPos().x()
        y = event.globalPos().y()
        lParam = win32api.MAKELONG(x, y)
        # left click on desktop (left button down + up, => should be replaced by event.button() pseudo switch case once working)
        windll.User32.SendInput(self.desktop, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
        windll.User32.SendInput(self.desktop, win32con.WM_LBUTTONUP, 0, lParam)
        # display position for debugging (position gets displayed, but nothing gets clicked)
        print(f'clicked on desktop at position {x} and {y}')


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    form = Overlay()
    app.exec_()
class main(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowFlags(Qt.Popup|Qt.WindowDoesNotAcceptFocus|Qt.WindowTransparentForInput)
        self.setAttribute(Qt.WA_AlwaysStackOnTop, True)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM