2012-05-31 54 views
2

我正尝试在Mono和X11中实现全局热键。不幸的是,应用程序使用System.Windows.Forms,所以我不能使用this question中提出的GDK#事件过滤器。Mono中的全局热键

使用XGrabKey的作品,但我遇到了事件循环的问题。关闭应用程序时,处理X11事件循环的线程仍挂在XNextEvent中。有没有办法解决这个问题?我宁愿不诉诸XPending投票。我可以以某种方式取消XNextEvent或发送虚拟事件吗?

我在根窗口打电话给XGrabKey,所以很遗憾我没有得到像DestroyNotifyUnmapNotify这样的事件。

+0

为什么你的程序没有平台特定部分?那么你可以使用GDK/GTK。 Anyhoo .. – IanNorton

+0

嗯,这是平台特定部分的一部分,因为显然使用'XGrabKey'在Windows上不起作用。但是从SWF迁移到Gtk#不是一种选择,为此只需引入整个Gtk#似乎是过度杀伤性的。 – bseibold

+0

我知道这是非常旧的帖子,但我处于相同的情况,似乎你设法让它工作,你有任何地方这个代码可用?或者可以将它作为解决方案发布? – Gusman

回答

1

使用​​发送XClientMessageEvent。创建您自己的原子并设置该事件的成员,以便可能在根窗口上监视XClientMessageEvent的其他应用程序不受影响。

在你的事件循环中,检查这个原子,如果你得到它,退出。

+0

听起来不错,我会尽快尝试。 – bseibold

+0

我现在做了类似的事情。因为无论如何我都需要一个窗口,所以我使用窗口的'DestroyNotify'事件而不是'ClientMessage'。建议的解决方案应该也可以工作。 – bseibold