【问题标题】:Avoid application activation and focus in when clicking buttons on it - Windows API or Qt避免应用程序激活并在单击按钮时集中注意力 - Windows API 或 Qt
【发布时间】:2013-09-10 19:19:26
【问题描述】:

情况:无边框 QDialog 成功地保持在其他应用程序之上。

问题是在单击此始终位于顶部的应用程序窗口时,会发生以下情况:

  • 被点击的始终在顶部的应用程序被激活
  • 点击的始终位于顶部的应用程序窗口会窃取之前活动/焦点应用程序的焦点

是否有可能在单击这个始终位于顶部的非活动且未聚焦的应用程序窗口时,

  • 当前应用没有失去激活和焦点
  • 虽然用户仍然能够与始终处于顶部的应用程序进行交互(点击按钮或下拉菜单、拖动窗口)?

我正在使用 Qt,但使用原生 Windows API 没有问题。

我尝试了以下 Qt windowFlag:

  • Qt::WindowDoesNotAcceptFocus 但它不起作用:始终处于顶部的应用程序已激活,已聚焦。
  • Qt::WindowTransparentForInput,always-on-top 应用程序对点击非常透明:未激活且未聚焦,但不幸的是点击时未触发按钮。

【问题讨论】:

    标签: qt winapi click focus always-on-top


    【解决方案1】:

    我不知道 QDialog,我只是将 QWidget 用于类似目的(显示 Windows 8 样式通知)。

    尝试设置:

    dialog->setFocusPolicy(Qt::NoFocus);
    dialog->setAttribute(Qt::WA_ShowWithoutActivating); 
    

    也许您必须为所有孩子制定重点政策。

    【讨论】:

    • 感谢headsvk,但它被始终在顶部的标志覆盖:dialog->setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); 似乎该标志与Qt::WA_ShowWithoutActivating 属性冲突。
    • 事实上它在 Windows 上根本不起作用(即使没有 WindowStaysOnTopHint),而在 Mac 上则存在冲突。我测试了 MainWindow,然后是 QDialog,最后是 QWidget。
    • 我也在使用Qt::WindowStaysOnTopHint。所以我尝试在弹出窗口中添加一个按钮,当我点击它时,它不会从我的活动窗口中窃取焦点。标志如何冲突?
    • 冲突发生在 Mac 上(抱歉造成混淆)。但是,让我们回到 Windows 上。应用程序仍然激活并获得焦点。我创建了一个示例 Qt GUI 项目,然后在 MainWindow 构造函数中添加了以下代码:pastebin.com/tKB2NSHz
    • 好的,它对我不起作用,我的弹出窗口没有窃取对节目的关注,所以我认为它也没有点击(我不点击它,我用鼠标关闭它输入),对不起
    【解决方案2】:

    使用 Windows 标志 (#include <qt_windows.h>) 可以使单击窗口时无法激活和无法聚焦。创建并显示窗口后必须使用以下内容:

    HWND winHandle = (HWND)winId();
    ShowWindow(winHandle, SW_HIDE);
    SetWindowLong(winHandle, GWL_EXSTYLE, GetWindowLong(winHandle, GWL_EXSTYLE)
        | WS_EX_NOACTIVATE | WS_EX_APPWINDOW);
    ShowWindow(winHandle, SW_SHOW);
    

    【讨论】:

    • 嗯,你怎么在 Qt 中做到这一点?覆盖winEvents?
    • 您可以覆盖showEvent()。对于它的实现,首先调用父方法然后上面的代码。
    • 不成功 :) 我已经成功地使用 PyWin 库将代码移植到 PyQt,覆盖 showEvent(),但是当我单击这个假设为非活动窗口上的控件时,我的主要窗口变为非活动状态。有什么想法吗?
    • 在另一个窗口中也覆盖showEvent() 怎么样?
    • 当你点击它的背景(而不是它的一个按钮)时,窗口是否处于活动状态。我记得我必须覆盖窗口菜单/下拉列表的 showEvent()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2011-05-01
    • 2011-07-24
    相关资源
    最近更新 更多