现在子窗口可以加,鼠标键盘事件可以穿透到主窗口,但是没办法让其背景透明。
用子窗口的目的,是使其跟着主窗口移动,省去自己管理的麻烦。
用top-level窗口也行,但是toplevel的会切换z序,用瞬态窗口(设置transient-for属性的窗口)可以达到不切换z序的目的,但是有标题栏,而不我不需要标题栏,而且透明后,输出的文字也跟着透明了。
我的代码如下,请指点:
代码: 全选
int XMapWindow(Display* display, Window w)
{
static void* handle = NULL;
static Func_XMapWindow old_XMapWindow = NULL;
if (!handle)
{
handle = dlopen("libX11.so", RTLD_LAZY);
old_XMapWindow = (Func_XMapWindow)dlsym(handle, "XMapWindow");
}
//获得窗口标题
char title[300] = { '\0' };
get_window_title4(display, w, title);
if (strstr(title, "WPS文字")) //“WPS文字”是无文档时的标题 随后打开文档了会变成“11.doc - WPS 文字 - 兼容模式” 这样的形式。 再此切回无文档tab页时,标题会变成“WPS 文字 - WPS文字”
{
int ret = old_XMapWindow(display, w);
//如果不存在水印窗口, 创建,让鼠标键盘事件穿透,背景透明,让主窗口变化大小时也跟着变化
if (g_water_print_window_exist == False)
{
XVisualInfo vinfo;
XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &vinfo);
XSetWindowAttributes attr;
attr.colormap = XCreateColormap(display, DefaultRootWindow(display), vinfo.visual, AllocNone);
attr.border_pixel = 0;
attr.background_pixel = 0x00ffffff;// 0x80808080;
attr.event_mask = StructureNotifyMask | KeyPressMask | ButtonPressMask | ButtonReleaseMask | ExposureMask;
//attr.override_redirect = True;
g_water_print_window = XCreateWindow(display, w , 0, 0, 400, 400, 0, vinfo.depth, InputOutput, vinfo.visual, CWColormap | CWBorderPixel | CWBackPixel | CWEventMask , &attr);
//g_water_print_window = XCreateSimpleWindow(display, w, 0, 0, 400, 400, 1, BlackPixel(display, DefaultScreen(display)),0x00ffffff );
printf("%s,%d,g_water_print_window:%lx\n", __FILE__, __LINE__, g_water_print_window);
//使事件穿透下去
XShapeCombineRectangles(display, g_water_print_window, ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded);
//使子窗口背景透明
Pixmap mask = XCreatePixmap(display, g_water_print_window, 400, 400, 1);
XShapeCombineMask(display, g_water_print_window, ShapeBounding, 0, 0, mask, ShapeSet);// ShapeClip ShapeBounding
old_XMapWindow(display, g_water_print_window);
GC gc = XCreateGC(display, g_water_print_window, 0, 0);
XDrawString(display, g_water_print_window, gc, 190, 190, "test", 4);
XFlushGC(display, gc);
////设置半透明,对子窗口无效。大约是因为子窗口不归窗口管理器管理?
//double alpha = 0.1;
//unsigned long opacity = (unsigned long)(0xFFFFFFFFul * alpha);
//Atom XA_NET_WM_WINDOW_OPACITY = XInternAtom(display, "_NET_WM_WINDOW_OPACITY", False);
//XChangeProperty(display, g_water_print_window, XA_NET_WM_WINDOW_OPACITY, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&opacity, 1L);
g_water_print_window_exist = True;
}
return ret;
}
return old_XMapWindow(display, w);
}
请高手指点
另外,我还要做阻止截图的功能,为什么我把几种最常用的截图相关函数hook了,还是拦截不住截图程序,比如xGetImage 、xcb_get_image_reply 等。是不是这些截图程序静态链接x11库了,还是用了别的方法截图了?