如何在 Qt 中将事件过滤器安装到 WindOWS 窗口?
Posted
技术标签:
【中文标题】如何在 Qt 中将事件过滤器安装到 WindOWS 窗口?【英文标题】:How to install a eventFilter to a WinOS window in Qt? 【发布时间】:2014-07-04 07:12:38 【问题描述】:我有一个 WinOS 窗口的句柄,例如。 Internet Explorer窗口,在Qt中我是这样弄的:m_hwndUnderCursor= WindowFromPoint(curPoint);
如何在QWidget::find(m_hwndUnderCursor)->installEventFilter(this);
QWidget::find(m_hwndUnderCursor)->installEventFilter(this);
m_hwndUnderCursor上成功安装一个eventFilter,这样我就可以在Qt中观看m_hwndUnderCursor,而无需HOOK技术。
我知道,因为 m_hwndUnderCursor 是一个指向 WinOS 窗口的指针,所以 QWidget::find(m_hwndUnderCursor) 总是返回 NULL。有没有办法做到这一点?
【问题讨论】:
【参考方案1】:一个快速的答案是:你不能这样做。
更详细的答案:
QObject::installEventFilter()
基于 Qt 的事件引擎(事件循环、事件传播等)工作。这是 Qt 的内部内容,它不适用于 Qt 应用程序之外的其他窗口。它仅适用于属于您调用 installEventFilter()
的同一应用程序的窗口。
出于类似原因,如果您尝试查找非 Qt 窗口,QWidget::find()
将永远不会在结果中为您提供现有的QWidget
。它仅适用于在 Qt 应用程序中创建的窗口。另请参阅:Can QWidget::find find widgets from a different process?
您将不得不使用本机 Windows API 来处理它。
【讨论】:
谢谢。Native Windows API 似乎是我唯一的选择。以上是关于如何在 Qt 中将事件过滤器安装到 WindOWS 窗口?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PyQt4 中将事件监听器添加到动态 QTableWidgetItem?
如何在非托管类中将 Tick 事件添加到 System::windows::Forms::Timer
installEventFilter可以安装到任何QObject的子类,并不仅仅是UI组件。事件过滤器和安装过滤器的组件必须在同一线程,在它们分属在不同线程时,事件过滤器也是不起作用的