- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想拦截发布到我正在编写的应用程序的特定窗口选择的 WM_DELETE_WINDOW
消息 (AllTray),以便我可以对其执行操作而不是接收它的应用程序。我目前正在考虑在 GDK 级别尝试这个 via gdk_display_add_client_message_filter
如果可能的话,但如果有 Xlib 解决方案,我也会很高兴;它似乎是可能的,但我似乎不明白我如何成功地做到这一点。
目前,我有两个程序(用 C 语言编写)正试图用来解决这个问题,the first one除了创建一个窗口并注册它知道 WM_DELETE_WINDOW
和 the second one 之外什么都不做试图捕获该消息,但似乎没有成功;它似乎什么也没做。我对文档的理解是错误的,还是我需要做一些额外的事情(或者我是否需要为此完全避免使用 GDK)?
背景是这样的:在我重写 AllTray 之前,它做事的方式似乎是试图拦截对 X 按钮本身的鼠标单击。对于某些窗口管理器,这可以正常工作,对于其他窗口管理器,它根本不起作用,而对于其他窗口管理器,用户必须手动配置它并指示 AllTray 关闭窗口的按钮在哪里。我正在寻找的解决方案不涉及 LD_LIBRARY_PRELOAD
,并且适用于符合当前标准并发送 WM_DELETE_WINDOW
ClientMessage 的任何窗口管理器/应用程序组合当窗口关闭时。
更新:我仍在寻找答案。我目前采取的路线是尝试重新设置窗口并自己管理它,但我就是无法让它工作。重新养育后,我似乎无法以任何方式取回它。我可能遗漏了一些非常基本的东西,但我无法弄清楚如何让它再次出现在我自己的窗口中,以将其重新显示在屏幕上。
更新 2:好吧,我又碰壁了。 X 服务器文档说要在窗口的事件掩码上设置 StructureNotifyMask 以接收 MapNotify 和 ReparentNotify 事件。我有兴趣接受其中任何一个。我目前的想法是创建一个仅用作事件接收器的窗口,然后当我获得有趣事件的事件时,通过创建和重新设置父级来对它们采取行动。但是,这似乎根本行不通。我实际收到的唯一事件是 PropertyNotify 事件。所以,这条路线似乎也做得不太好。
最佳答案
我不知道 X11,但我用 "Intercept WM_DELETE_WINDOW
X11" 搜索了一下作为关键字。找到17k - MarkMail和 Mplayer-commits r154 - trunk/libvo .在这两种情况下,他们都在做同样的事情。
/* This is used to intercept window closing requests. */
static Atom wm_delete_window;
在 static void x11_init()
中,
XMapWindow(display, win);
wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", False);
XSetWMProtocols(display, win, &wm_delete_window, 1);
然后,在 static int x11_check_events()
中,
XEvent Event;
while (XPending(display)) {
XNextEvent(display, &Event);
if (Event.type == ClientMessage) {
if ((Atom)Event.xclient.data.l[0] == wm_delete_window) {
/* your code here */
}
}
}
参见 XInternAtom , XSetWMProtocols和 XNextEvent .
我写完上面之后,找到了Handling window close in an X11 app :
When a user clicks the close button
[x]
on our X11 application we want it to pop a a dialog asking “do you really want to quit?”. This is a plain X app. No fancy GTK or QT widgets here. So how to catch the “window is being closed” message?The answer is to tell the Window Manager we are interested in these event by calling
XSetWMProtocols
and registering aWM_DELETE_WINDOW
message with it. Then we’ll get a client message from the Window Manager if someone tries to close the window, and it won’t close it, it’ll leave that us up to us. Here’s an example….
// example.cpp
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <iostream>
int main()
{
Display* display = XOpenDisplay(NULL);
Window window = XCreateSimpleWindow(display,
DefaultRootWindow(display),
0, 0,
500, 400,
0,
0, 0);
// register interest in the delete window message
Atom wmDeleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", False);
XSetWMProtocols(display, window, &wmDeleteMessage, 1);
std::cout << "Starting up..." << std::endl;
XMapWindow(display, window);
while (true) {
XEvent event;
XNextEvent(display, &event);
if (event.type == ClientMessage &&
event.xclient.data.l[0] == wmDeleteMessage) {
std::cout << "Shutting down now!!!" << std::endl;
break;
}
}
XCloseDisplay(display);
return 0;
}
关于c - 在 X11 上拦截 WM_DELETE_WINDOW?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1157364/
我刚开始使用新的拦截方法,有一个基本问题,想知道如何在一个测试中链接下面的两个断言。 cy.intercept('GET', '/states').as('states'); cy.reload(tr
我有一个标签控件的自定义版本(使用用户控件构建)。在设计器中工作时,我想截取 Name 属性的设置(在属性面板中)并使用它来生成 Text 属性。也就是说,如果我在属性面板的 Name 属性中输入“l
嗨,我想通过 soapUI 解析 ssl soap 消息,而我试图通过 HttpMonitor 进行拦截它显示在异常下方 ERROR:Exception in request: javax.net.s
是否有可能从某个任意层拦截反向梯度,修改其值并继续反向传播回到网络的开始,根据您提供的修改后的梯度值更新所有先前层的反向梯度? 我知道你可以directly modify the gradients
我可以从什么 dll 中获得 Intercept 的扩展?我从 http://github.com/danielmarbach/ninject.extensions.interception 添加了
我有一个实现 onCreateOptionsMenu 方法的顶级 TabHost。我希望子 Activity (选项卡内的子 Activity )能够通过 onOptionsItemSelected
我在尝试反序列化 URL 时遇到此错误 Caused by: java.net.MalformedURLException: no protocol: www.boo.com at java.
首先,我是 Spring 的新手,这是我第一次尝试使用 Spring 编写基于 REST 的应用程序。 我计划在请求参数和响应中使用 Json。这让我想到两个问题。 有没有办法将 products="
在我基于 j_security_check 的登录表单中登录时一切正常。在这种情况下,我看到 JSESSIONID cookie 中的路径具有来自 URL 的值。但是当另一个登录页面构造动态表单(它正
我有一个我一直致力于下载文件的程序。一切正常,除非用户使用 AVG。奇怪的是,为了解决这个问题,似乎必须禁用 AVG 的“电子邮件保护”;将我的程序或 JRE 添加到异常(exception)列表不起
我正在寻找一种方法来挂接 SMSManager 或较低级别的机制,以便我可以在发送任何外发 SMS 消息之前拦截、读取和取消它们。 最佳答案 迟到总比不到好:) 我已经在这上面花了 2 天...并且不
我已成功拦截对 read() 的调用, write() , open() , unlink() , rename() , creat()但不知何故截获完全相同的语义stat()没有发生。我已经使用 L
阿里云ECS通过安全组屏蔽/拦截/阻断特定IP对云服务器的访问 所适用的场景: 通过安全组屏蔽、拦截、阻止特定IP对用户云服务器的访问,或者屏蔽IP访问服务器的特定端口。 配置的方法: 1、
我希望能够在类本身的构造函数中代理类的所有方法。 class Boy { constructor() { // proxy logic, do something before
使用 ajax 请求可以使用以下代码完成: let oldXHROpen = window.XMLHttpRequest.prototype.open; window.lastXhr = ''; wi
我想“拦截”/更改将 OData 与 Web API 一起使用时生成的 OData 查询..但我不完全确定如何“提取”生成的查询..我假设 OData 过滤器、扩展和更多一些如何生成某种表达式树或某种
当 JUnit 中的断言失败时,我想做一些“自己的事情”。我想要这个: public class MyAssert extends org.junit.Assert { // @Overrid
如何拦截 PartialFunction?例如在 Actor 中,如果我只想打印进入以下接收方法的所有内容,然后再将其传递给流程方法: class MyActor extends Actor {
我们正在使用 fluentvalidation(带有服务堆栈)来验证我们的请求 DTO。我们最近扩展了我们的框架以接受“PATCH”请求,这意味着我们现在需要仅在补丁包含要验证的字段时才应用验证。 我
我有一个作为 excel 插件运行的 WPF 应用程序,它有这样的可视化树 精益求精 元素主机 WPF 用户控件 WPF 色带条控件 现在,在 excel 中加载插件时,不会启用位于 WPF 功能区栏
我是一名优秀的程序员,十分优秀!