QT窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透

qt 窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透

窗口置顶
qt 里是 setWindowFlags(Qt::WindowStaysOnTopHint)
kde 里是 KWindowSystem::setState(winId(), NET::KeepAbove)
这样的置顶窗口不会处于全屏窗口的上方,如果需要真正的置顶,setWindowFlags(Qt::X11BypassWindowManagerHint) 可无视这个规则,但这样不会出现任务栏等,kimtoy 的预编辑窗口就是真正的置顶。

真透明

qt 里是 setAttribute(Qt::WA_TranslucentBackground, true)
真透明需要窗口管理器开启混成,否则透明区域将显示为黑色,这时候可以用非矩形来抠去黑色区域。


背景模糊

kde 扩展 Plasma::WindowEffects::enableBlurBehind(winId(), true, /*这里有个参数指定模糊区域*/)
背景模糊需要窗口管理器开启模糊特效,否则无效。kde kwin 的扩展标识,其它桌面上可能没有模糊效果。


非矩形

qt 里是 setMask(/*这里有个参数指定非矩形区域*/)
没有开桌面混成的时候达到没有黑色区域的效果,形状复杂的话相当消耗资源,使用非透明区域作为形状会产生边缘锯齿。

跳过任务栏分页器
kde 里是 KWindowSystem::setState(winId(), NET::SkipTaskbar | NET::SkipPager)
这样的窗口经过隐藏再显示出来时,如果程序其它对话框弹出,原先设置跳过任务栏分页器的窗口将失效。解决办法是实现 showEvent(QShowEvent* event) 中再次调用一下。kimtoy 的状态栏窗口在弹出关于kimtoy对话框或者设置对话框后就不能跳过任务栏分页器的,即通过此法解决,krunner也是这样的。

无边框
qt 里是 setWindowFlags(Qt::FramelessWindowHint)
实际上只要能获得焦点,ctrl+f3 打开kwin的菜单还能还原的哦,比如krunner,很多plasmiod。。


无焦点点击

qt 里是 setAttribute(Qt::WA_X11DoNotAcceptFocus, true)
无焦点点击的意思是用鼠标在窗口上进行操作而不将键盘输入的焦点转移到窗口中。kimtoy 的状态栏窗口就是这样子,鼠标可以切换功能,但输入法的各个状态依然是输入焦点窗口而非 kimtoy 状态栏窗口的,这样可实现真正的 Dock。

焦点穿透
很遗憾qt没有这个函数只好直接用x11shape的 XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded)

焦点穿透的意思是所有鼠标键盘操作全部会穿透窗口到下方窗口。有个 Qt::WA_TransparentForMouseEvents 可以对子部件实现,而窗口本身不行。kimtoy 没用到这个,不过很多 osd 桌面歌词程序经常用,网上找了下只有 gdk 的实现,于是就把 qt 的写在这里啦。

本文章转自http://blog.csdn.net/outmanlee/article/details/7451097

时间: 2024-10-13 21:55:56

QT窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透的相关文章

菜单复选及窗口置顶

void CKLKKDlg::OnTop() { // TODO: 在此添加命令处理程序代码 UINT i=GetMenu()->GetMenuState(ID_TOP,MF_CHECKED);//判断选中状态 if (i==MF_CHECKED) { GetMenu()->CheckMenuItem(ID_TOP,MF_UNCHECKED);//取消选择 SetWindowPos(&wndNoTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//窗口不置顶

ahk之路:利用ahk在window7下实现窗口置顶

操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我的ahk之路. 先写了一个一直想在windows下实现的功能--窗口置顶,在linux下用习惯了这个功能,还真是离不开了.代码很简单: 1 #t:: 2 WinSet AlwaysOnTop,On,A 3 return 4 5 ^#t:: 6 WinSet AlwaysOnTop,Off,A 7 r

win应用只允许单个实例运行,并将已运行实例窗口置顶

关键词:windows,c++,桌面应用,单个实例,窗口置顶 目标:1.判断本程序是否已有一个实例在运行.2.若有,则激活已在运行的实例(将其窗口置顶),并退出当前运行. 1.使用semaphore来检测是否已有实例在运行(也可以用mutex,文件等其他方式) HANDLE g_hSingleSema = ::CreateSemaphore(NULL, 1, 1, _T("single_myapp_sema")); if (g_hSingleSema && ERROR_

vc 使窗口置顶 在最前面

bool SetWindowTop(CWnd* pWnd){ if(!pWnd) {   return false; } if(pWnd->GetExStyle()&WS_EX_TOPMOST) {   return true; } else {   int i= pWnd->SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);   if (i==0)    return false;   else   

WPF 打开第三方程序并让程序窗口置顶

需要用到几个Win32函数: FindWindow GetWindowRect SetWindowPos //获取第三方程序窗口句柄 IntPtr hwnd = (IntPtr)Win32.FindWindow(null, "第三方程序窗口标题"); //获取窗口的位置和大小 Win32.GetWindowRect(hwnd, out rect); //设置窗口位置,第二个参数的意思是置顶,最后一个参数的意思是不可改变大小 Win32.SetWindowPos(hwnd, -1, re

WPF实现只打开一个窗口,并且重复打开时已经打开的窗口置顶

内容来自:https://codereview.stackexchange.com/questions/20871/single-instance-wpf-application 第一步:添加System.RunTime.Remoting引用 第二步:新建一个类class1.cs(按自己想法命名) using System; using System.Collections; using System.Collections.Generic; using System.ComponentMode

窗口置顶方法

CWindow::SetWindowPos BOOL SetWindowPos( HWND hWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags ); BOOL SetWindowPos( HWND hWndInsertAfter, LPCRECT lpRect, UINT nFlags ); 1 BOOL CXXX::OnInitDialog() 2 { 3 CRect rect; 4 GetWindowRect(&rect);

窗口置顶

hwnd = win32gui.FindWindow('','***') if(hwnd): win32gui.EnableWindow(hwnd,True)#这句关键 win32gui.SetForegroundWindow(hwnd)

TopWnd一键置顶窗口的实现,分享源码

TopWnd为一款精小实用的绿色软件,可以置顶大部分的窗口,一键置顶,一键取消! 贴上下载地址: 我一直都在实用这个小工具,今日好奇,决定一探其内部究竟如何实现. 网上搜索一番,没有找到这个小工具的源码. 无奈只好一步步的自己去实现它. 最终用MFC+全局钩子成功模仿了一个相差无几的程序. 准备工作 visual studio 2012 建MFC工程 拖几个控件 参考文章:http://blog.csdn.net/friendan/article/details/12168273 全局钩子 源码