6

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

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

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

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

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

我正在使用 Qt,但使用本机 Windows API 没有问题。

我尝试了以下 Qt windowFlag:

  • Qt::WindowDoesNotAcceptFocus但它不起作用:始终处于顶部的应用程序被激活,专注。
  • Qt::WindowTransparentForInput,永远在线的应用程序对点击真的是透明的:没有激活也没有聚焦,但不幸的是,按钮在点击时没有被触发。
4

2 回答 2

7

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

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);
于 2013-09-12T21:17:06.413 回答
1

I don't know about QDialog, I'm using just a QWidget for similar purpose (displaying a Windows 8 style notification).

Try setting:

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

maybe you'll have to set focus policy on all children.

于 2013-09-07T11:41:29.003 回答